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.
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 )