In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

DBComboboxMod error al usar dtBOUND

Foro de Xailer profesional en español
Responder
Israel Solis
Mensajes: 155
Registrado: Mié Nov 03, 2004 12:42 pm
Ubicación: Cancún, México
Contactar:

DBComboboxMod error al usar dtBOUND

Mensaje 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>
Saludos :D

Israel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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.
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Israel Solis
Mensajes: 155
Registrado: Mié Nov 03, 2004 12:42 pm
Ubicación: Cancún, México
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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
Saludos :D

Israel
Israel Solis
Mensajes: 155
Registrado: Mié Nov 03, 2004 12:42 pm
Ubicación: Cancún, México
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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 )
Saludos :D

Israel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
xhermita
Mensajes: 177
Registrado: Vie Feb 18, 2011 10:05 pm
Ubicación: Las Palmas de Gran Canaria
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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
Pedro Amaro
2PC Service

Xailer / Néfele / MySQL-MariaDB / SQLServer
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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 ;-)
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
xhermita
Mensajes: 177
Registrado: Vie Feb 18, 2011 10:05 pm
Ubicación: Las Palmas de Gran Canaria
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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.
Pedro Amaro
2PC Service

Xailer / Néfele / MySQL-MariaDB / SQLServer
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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.
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
xhermita
Mensajes: 177
Registrado: Vie Feb 18, 2011 10:05 pm
Ubicación: Las Palmas de Gran Canaria
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje por xhermita »

Código probado ...

No funciona.

:roll:
Pedro Amaro
2PC Service

Xailer / Néfele / MySQL-MariaDB / SQLServer
Avatar de Usuario
bingen
Mensajes: 565
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: DBComboboxMod error al usar dtBOUND

Mensaje 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 )
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder