Page 1 of 1

Pregunta sobre RecordSet en MySql

PostPosted: Tue May 12, 2009 4:15 am
by Raymundo Islas M.
Hola a todos,

Tengo la siguiente situacion :

Al crear un RS : SELECT campo1,campo2,campo3...,0 AS itmsld FROM xtabla WHERE etc etc
anexo ese campo en cero para poder despues usarlo en validar si el usuario selecciono tal registro, si es asi, le quiero asignar valor de uno para identificarlo.

Y tomala !!!! me marca error :

Error description : Error adodb.recordset:FIELDS/0 S_OK:_VALUE

Ahora, si agrego un campo a la tabla para que me sirva para tal efecto, no me manda ese error, sino otro :

Error description : Error adodb.recordset/6 DISP_E_UNKNOWNAME: MOVENEXT

Y este es el codigo que uso :


Code: Select all  Expand view
aRS:MoveFirst()
WHILE !aRS:Eof()
  aRS:FIELDS("ITMSLD"):Value := 1
  aRS:MoveNext()
ENDDO
 


Ya le busque de varias maneras y nop, no se deja.

Alguno que puede indicarme que estoy haciendo mal o en todo caso, algun alternativa para esto.

Gracias y Saludos

Re: Pregunta sobre RecordSet en MySql

PostPosted: Tue May 12, 2009 5:12 am
by carlos vargas
Ray

Realize una prueba directa desde SQLyog con una tabla en Mysql, cree una tabla
Code: Select all  Expand view

cliente  CREATE TABLE `cliente` (                      
           `codigo` bigint(2) NOT NULL auto_increment,  
           `nombre` char(20) NOT NULL default '',      
           `edad` int(11) NOT NULL default '0',        
           PRIMARY KEY  (`codigo`)                      
         ) ENGINE=InnoDB DEFAULT CHARSET=latin1  
 


luego agrege unos registros
Code: Select all  Expand view

/*[10:51:28 p.m.][  31 ms]*/ insert into `cliente`(`codigo`,`nombre`,`edad`) values ( NULL,'carlos','36');
/*[10:51:35 p.m.][   0 ms]*/ insert into `cliente`(`codigo`,`nombre`,`edad`) values ( NULL,'manuel','25');
/*[10:51:41 p.m.][  16 ms]*/ insert into `cliente`(`codigo`,`nombre`,`edad`) values ( NULL,'jose','3');
 


luego realize una consulta similar a lo que tu quieres logran con ado

Code: Select all  Expand view

select codigo, nombre, edad from cliente
 

Estos datos son editables

pero insertando el campo que tu necesitas y que sera usado por el usuario para marcar un estado 'itmsld'

Code: Select all  Expand view

select codigo, nombre, edad, 0 AS itmsld from cliente
 

el grupo de datos de esta consulta no es editable.

He buscado en las ayudas de mysql, vfp y google, y no he encontrado una forma de hacerlo como tu indicas.
una posible forma es
hacer una alter table a la tabla, agregar una columna, usarla y lugo con alter table nuevamente eliminar la columna innecesario, pero no se
que tan adecuado sea eso.
:-(

sorry.

alguien con mas experiencia en sql ....

salu2

Re: Pregunta sobre RecordSet en MySql

PostPosted: Tue May 12, 2009 6:01 am
by wmormar
Ray,

Alguna vez intente lo que comentas, si resultados favorables.

Lo que hice fue generar un columna (campo) para ese efecto sin problema alguno.

El error que se genera con el movenext, puede ser por razones de que la consulta no se ha generado o no hay conexión al servidor o el objeto que generas del recordset no es válido.

Soidito puede ayudarte mas específicamente con ADO, le ha metido mucho a ese tema.

Re: Pregunta sobre RecordSet en MySql

PostPosted: Tue May 12, 2009 2:25 pm
by Raymundo Islas M.
Muchas gracias Carlos y William,

Carlos : tienes razon, se bloquea el RS cuando se anexa la columna ya no es editable.

William : Eso es lo raro, que si esta activo el RS ya que visualizo el contenido y puedo hacer filtros, busquedas, etc

Seguire buscando y probando, ya que si son varios los browses que tengo en la app bajo esta modalidad y como me puse como loco a cambiar los browses de arrays/dbf temporales a recordsets sin darme cuenta de este detalle, pues, ahora no puedo avanzar :?

Saludos

Al rato le marco al buen amigo Armando :wink:

Re: Pregunta sobre RecordSet en MySql

PostPosted: Tue May 12, 2009 3:46 pm
by Armando
Ray:

Tomando tu ejemplo

Code: Select all  Expand view

Al crear un RS : SELECT campo1,campo2,campo3...,0 AS itmsld FROM xtabla WHERE etc etc
 


No es posible hacerlo funcionar pues recuerda que el campo adicional (itmsld) solo existe en el RecordSet y con el código

Code: Select all  Expand view

aRS:MoveFirst()
WHILE !aRS:Eof()
  aRS:FIELDS("ITMSLD"):Value := 1
  aRS:MoveNext()
ENDDO
 


Al actualizar el campo temporal (aRS:FIELDS("ITMSLD"):Value := 1) y mover el puntero (aRs:MoveNext()) se actualiza tanto el RecordSet como la tabla, SÍ aunque no hagas el famoso oRs:Update(), peroooooo resulta que la tabla no tiene el campo itmsld y por eso te truena.

Creo que lo correcto es que definas un campo de tipo lógico pero en la tabla y te lo lleves al RecordSet para usarlo como Seleccionado o no.

Otro detalle que veo en tu código es que estas en un loop (WHILE) para actualizar el record set, yo te recomiendo que hagas uso de la fuerza bruta de un comando SQL (UPDATE ....) para actualizar la tabla y despues refrescas el Record Set.

Sabras que desgraciadamente tronó mi Disco Duro y apenas estoy en la etapa de recuperación de respaldos, tal vez por eso no me "veas" en el messenger.

Saludos

Re: Pregunta sobre RecordSet en MySql

PostPosted: Tue May 12, 2009 4:32 pm
by Armando
Ray:

Te cuento, con el siguiente código no tira error alguno.

Code: Select all  Expand view

TRY
    oRsCxc  :=  TOleAuto():New("adodb.recordset")
CATCH oError
    MsgStop( "No se ha podido crear el RECORDSET de Cuentas por cobrar !", oApp:cAplicacion)
    ShowError(oError)
    oRsCxc  :=  NIL
    RETURN(.F.)
END

oRsCxc:CursorLocation   := adUseClient
oRsCxc:LockType          := adLockOptimistic
oRsCxc:CursorType        := adOpenDynamic
oRsCxc:Source              := "SELECT " + ;
                                        "* " + ;
                                    "FROM " + ;
                                        "carcxc " + ;
                                    "WHERE " +;
                                        "car_sdo <> 0.00" +;
                                    "ORDER BY " +;
                                        "car_cli,car_doc"
oRsCxc:Properties("Unique Table"):Value := "carcxc"
oRsCxc:PageSize         := 20
oRsCxc:CacheSize       := 20
oRsCxc:ActiveConnection(oApp:oCon)

TRY
    oRsCxc:Open()
CATCH oError
    MsgStop( "No se ha podido abrir el RECORDSET de Cuentas por cobrar !", oApp:cAplicacion)
    ShowError(oError)
    RETURN(.F.)
END

IF oRsCxc:BOF() .AND. oRsCxc:EOF()
ELSE
    oRsCxc:MoveFirst()
    DO WHILE ! oRsCxc:EOF()
        oRsCxc:Fields("CAR_PAH"):Value := (.T.)
        oRsCxc:MoveNext()
    ENDDO
    oRsCxc:MoveFirst()
ENDIF
 


El campo CAR_PAH esta definido desde la creación de la tabla.

Quedo a tus ordenes.