Página 1 de 1

DBComboboxMod error al usar dtBOUND

Publicado: Jue Mar 30, 2023 2:51 am
por Israel Solis
Xailer team,

Al usar un DBComboboxMod con dtBOUND y el usuario selecciona una opción se marca Error: <seleccion>

Supongamos el siguiente escenario con el SAMPLE \Xailer8.2\Samples\Modern\ComboBox

Tomando el DBComboboxMod...

:nDataType := dtBOUND
:oDataField := Last // asociado a un campo
:onCreate := DBComboboxMod1Create

METHOD DBComboboxMod1Create( oSender ) CLASS TForm1
oSender:aItems := {"(ninguno)", "azul"} // <<=== Opciones de texto que se necesitan cargar en tiempo de ejecución
oSender:aItemsBound := {"", "blue"}
RETURN Nil

Listo, ahora al correr este SAMPLE y seleccionar del combo otra opcion de la lista coloca el texto Error: <azul>

Re: DBComboboxMod error al usar dtBOUND

Publicado: Jue Mar 30, 2023 7:59 pm
por ignacio

Código: Seleccionar todo

METHOD SetValue( xValue, lFocused, lUpdPict, lWithEvent ) CLASS XDBComboBoxMod

   LOCAL nVal, nAt

   DO CASE
   CASE ::nDataType == dtDEFAULT
      IF Valtype( xValue ) == "N" .AND. xValue > 0 .AND. xValue <= Len( ::aItems )
         xValue := ::aItems[ xValue ]
      ENDIF
   CASE ::nDataType == dtINDEX
      nVal := IIF( Valtype( xValue ) != "N", Val( xValue ), xValue )
      IF nVal > 0 .AND. nVal <= Len( ::aItems )
         xValue := ::aItems[ nVal ]
      ELSE
         xValue := "Error: <" + ToString( xValue ) + ">"
      ENDIF
   CASE ::nDataType == dtBOUND
      IF ValType( ::oDataField ) == "O" .AND. ::oDataField:Valtype() == "N"
         IF ValType( xValue ) == "C" // se ha pasado el literal y no el valor bound
            nAt := AScan( ::aItems, Trim( xValue ) )
         ELSE
            nAt := AScan( ::aItemsBound, xValue )
         ENDIF
      ELSEIF ValType( xValue ) == "C"
         nAt := AScan( ::aItems, Trim( xValue ) )
      ELSE
         nAt := 0
      ENDIF
      IF nAt > 0 .AND. nAt <= Len( ::aItems )
         xValue := ::aItems[ nAt ]
      ELSE
         xValue := "Error: <" + ToString( xValue ) + ">"
      ENDIF
   ENDCASE

RETURN ::Super:SetValue( xValue, lFocused, lUpdPict, lWithEvent )
Gracias.

Re: DBComboboxMod error al usar dtBOUND

Publicado: Vie Mar 31, 2023 7:27 pm
por Israel Solis
Igracio,

No, no funcionó... Sobrecargando la solución que has publicado en el mismo SAMPLE de xailer... sigue dando el mismo error que comento

Re: DBComboboxMod error al usar dtBOUND

Publicado: Vie Mar 31, 2023 11:33 pm
por Israel Solis
Ignacio,

Hemos encontrado el problema, ya funciona el dtBOUND

GRACIAS PEDRO !!

Código: Seleccionar todo

METHOD SetValue( xValue, lFocused, lUpdPict, lWithEvent ) CLASS TDBComboBoxMod

   LOCAL nVal, nAt

   DO CASE
   CASE ::nDataType == dtDEFAULT
      IF Valtype( xValue ) == "N" .AND. xValue > 0 .AND. xValue <= Len( ::aItems )
         xValue := ::aItems[ xValue ]
      ENDIF
   CASE ::nDataType == dtINDEX
      nVal := IIF( Valtype( xValue ) != "N", Val( xValue ), xValue )
      IF nVal > 0 .AND. nVal <= Len( ::aItems )
         xValue := ::aItems[ nVal ]
      ELSE
         xValue := "Error: <" + ToString( xValue ) + ">"
      ENDIF
   CASE ::nDataType == dtBOUND
      IF ValType( ::oDataField ) == "O" .AND. ::oDataField:Valtype() == "N"
         IF ValType( xValue ) == "C" // se ha pasado el literal y no el valor bound
            nAt := HB_Ascan( ::aItems, {|x| Trim(x)== Trim( xValue )} )
         ELSE
            nAt := AScan( ::aItemsBound, xValue )
         ENDIF
      ELSEIF ValType( xValue ) == "C"
         nAt := HB_Ascan( ::aItems, {|x| Trim(x)== Trim( xValue )} )
      ELSE
         nAt := 0
      ENDIF
      IF nAt > 0 .AND. nAt <= Len( ::aItemsBound )
         xValue := ::aItemsBound[ nAt ]
      ELSE
         xValue := "Error: <" + ToString( xValue ) + ">"
      ENDIF
   ENDCASE

RETURN ::Super:SetValue( xValue, lFocused, lUpdPict, lWithEvent )

Re: DBComboboxMod error al usar dtBOUND

Publicado: Sab Abr 01, 2023 11:46 am
por ignacio
Israel Solis escribió: Vie Mar 31, 2023 7:27 pm Igracio,

No, no funcionó... Sobrecargando la solución que has publicado en el mismo SAMPLE de xailer... sigue dando el mismo error que comento
Pues a mi no. Extraño

Saludos

Re: DBComboboxMod error al usar dtBOUND

Publicado: Sab Abr 01, 2023 12:03 pm
por ignacio
Hola,
Revisado y la solución de Pedro no es correcta. Estaba mejor al prinicipio, pero con un ajuste:

Código: Seleccionar todo

      ELSEIF ValType( xValue ) == "C"
         nAt := AScan( ::aItemsBound, Trim( xValue ) )
         IF nAt == 0 .AND. ::lFreeEdit
            nAt := AScan( ::aItems, Trim( xValue ) )
         ENDIF             
      ELSE
Creo que así está bien.

Saludos

Re: DBComboboxMod error al usar dtBOUND

Publicado: Sab Abr 01, 2023 4:42 pm
por xhermita
El valor de xValue que nos llega a SetValue es el cText del DTDBComboBoxMod por lo que no podemos buscarlo en ::aItemsbound.

Código: Seleccionar todo

      ELSEIF ValType( xValue ) == "C"
         nAt := Ascan( ::aItems, Trim( xValue ) )
      ELSE
Pero al llamar a Super:SetValue si le tenemos que dar el valor en ::aItemsbound equivalente

Código: Seleccionar todo

      IF nAt > 0 .AND. nAt <= Len( ::aItemsBound )
         xValue := ::aItemsBound[ nAt ]
      ELSE
         xValue := "Error: <" + ToString( xValue ) + ">"
      ENDIF

Re: DBComboboxMod error al usar dtBOUND

Publicado: Sab Abr 01, 2023 5:36 pm
por ignacio
Me temo que no es así. Te olvidas de la asignación del combo por la navegación en un browser, por ejemplo.

Para algo soy el que lo hizo ;-)

Re: DBComboboxMod error al usar dtBOUND

Publicado: Sab Abr 01, 2023 6:34 pm
por xhermita
Pues algo pasa, porque en las pruebas que hicimos Israel y yo lo que nos llegaba era el cText.

Volveremos a revisar las pruebas.

Re: DBComboboxMod error al usar dtBOUND

Publicado: Sab Abr 01, 2023 8:16 pm
por ignacio
Como te va a llegar algo que no existe? El browse tiene los valores de aItemsBound, no los de aItems. Los de aItems son los que te muestra cuando ve una coincidencia en la otra matriz . Son dos escenarios distintos que ambos utilizan SetValue(). En un caso se recibe el VERDADERO dato y en otro caso se recibe la pulsación del usuario. Te recomiendo que pruebes el código que he subido.

Re: DBComboboxMod error al usar dtBOUND

Publicado: Sab Abr 01, 2023 9:19 pm
por xhermita
Código probado ...

No funciona.

:roll:

Re: DBComboboxMod error al usar dtBOUND

Publicado: Mar May 16, 2023 12:46 pm
por bingen
Pues me pasa el mismo error en un DBComboboxMod que en el xfm se ve así
WITH OBJECT ::oDBComboBox1 := TDBComboboxMod():New( ::oFolderPage1 )
:SetBounds( 188, 140, 130, 21 )
:nMaxLength := 15
:aItems := { "Hombre / Gizon", "Mujer / Emakume" }
:aItemsBound := { "H", "M" }
:nDataType := dtBOUND
:oDataField := "Sexo"
:Create()
END
y al seleccionar un elemento cualquiera me almacena un valor numérico 0 (cero) en el campo sexo.
Lo más cachondo es que cuando vuelves a entrar muestra el texto Error: <0> en el campo y si selecciono de nuevo un item como "Hombre / Gizon" el campo pasa a contener "Error: <Hombre / Gizon>" o sea inserta el texto del item dentro del error.

Re: DBComboboxMod error al usar dtBOUND

Publicado: Mar May 16, 2023 1:37 pm
por ignacio
A ver si ahora si:

Código: Seleccionar todo

METHOD SetValue( xValue, lFocused, lUpdPict, lWithEvent ) CLASS XDBComboBoxMod

   LOCAL nVal, nAt

   DO CASE
   CASE ::nDataType == dtDEFAULT
      IF Valtype( xValue ) == "N" .AND. xValue > 0 .AND. xValue <= Len( ::aItems )
         xValue := ::aItems[ xValue ]
      ENDIF
   CASE ::nDataType == dtINDEX
      IF Valtype( xValue ) == "N"
         IF xValue > 0 .AND. xValue <= Len( ::aItems )
            xValue := ::aItems[ xValue ]
         ELSE
             xValue := "Error: <" + ToString( xValue ) + ">"
         ENDIF
      ENDIF
   CASE ::nDataType == dtBOUND
      IF ValType( ::oDataField ) == "O" .AND. ::oDataField:Valtype() == "N"
         IF ValType( xValue ) == "C" // se ha pasado el literal y no el valor bound
            nAt := AScan( ::aItems, Trim( xValue ) )
         ELSE
            nAt := AScan( ::aItemsBound, xValue )
         ENDIF
      ELSEIF ValType( xValue ) == "C"
         nAt := AScan( ::aItemsBound, Trim( xValue ) )
         IF nAt == 0 //.AND. ::lFreeEdit >>>>>>>>>>>>>>>>>> Simplemente comenta después del cero
            nAt := AScan( ::aItems, Trim( xValue ) )
         ENDIF
      ELSE
         nAt := 0
      ENDIF
      IF nAt > 0 .AND. nAt <= Len( ::aItems )
         xValue := ::aItems[ nAt ]
      ELSE
         xValue := "Error: <" + ToString( xValue ) + ">"
         RETURN 0
      ENDIF
   ENDCASE

RETURN ::Super:SetValue( xValue, lFocused, lUpdPict, lWithEvent )