Página 1 de 1

Error al usar Metodo LOCATE con mas de 1 campo.

Publicado: Vie May 25, 2007 11:24 pm
por Fernando Hernandez
Buenas Tardes
Estos con una rutina para poder incorporar la informacion de la pocket ya
directamente a la base de datos en Oracle, pues bien uso el metodo locate,
pero no me esta evaluando cuando le paso mas de 2 campos a comparar. con uno
me funciona correcto. La informacion la leo de una tabla DBF. Existe algun
problema en este metodo al evaluar mas de 1 campo ?? Adjunto pantalla con el
error mostrado tambien; sin embargo luego de mostrar el error, el programa
continua con la rutina.
En espera de sus comentarios.
Adjunto parte del codigo.
------------------------------------------------------------ -----------------------------------------------------------
WITH OBJECT clsqldestino := TSQLTable():New()
:oDataSource := clSqlAdo
:cProcess := "GENERAL"
:nCursorType := adOpenDynamic
:nLockType := adLockOptimistic
:cTableName := ClPara5
:Create()
END
clsqldestino:lOpen:=.T.
Do While !eof()
IF CLPARA2='QUEJASD.CSV'
-- EN ESTA LINEA DA EL ERROR
clFOund=iif(CLSQLDESTINO:locate("CLIENTE='"+mCliente+"' AND
CODIGO='"+mCodigo+"'"),.t.,.f.)
--
ENDIF
......------------------------------------------------------ ------------------------------------------------------------ --


Attached files

Error al usar Metodo LOCATE con mas de 1 campo.

Publicado: Vie May 25, 2007 11:31 pm
por Fernando Hernandez
Solo para agregar algo, antes de comenzar a desarrollar en Xailer el
software de Backoffice para la pocket PC, habia comenzado algo en Minigui y
xHarbour, lo que si recuerdo es que el metodo LOCATE de ado no me funciono
por lo que termine usando el metodo FIND, que si me permite evaluar varios
campos, podria ser posible agregar este metodo a la clase TSQLTABLE.
En espera de sus comentarios.
"Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
news:[email=465752db@ozsrv2.ozlan.local...]465752db@ozsrv2.ozlan.local...[/email]
> Buenas Tardes
>
> Estos con una rutina para poder incorporar la informacion de la pocket ya
> directamente a la base de datos en Oracle, pues bien uso el metodo
> locate, pero no me esta evaluando cuando le paso mas de 2 campos a
> comparar. con uno me funciona correcto. La informacion la leo de una tabla
> DBF. Existe algun problema en este metodo al evaluar mas de 1 campo ??
> Adjunto pantalla con el error mostrado tambien; sin embargo luego de
> mostrar el error, el programa continua con la rutina.
>
> En espera de sus comentarios.
>
> Adjunto parte del codigo.
>
> ------------------------------------------------------------ -----------------------------------------------------------
> WITH OBJECT clsqldestino := TSQLTable():New()
> :oDataSource := clSqlAdo
> :cProcess := "GENERAL"
> :nCursorType := adOpenDynamic
> :nLockType := adLockOptimistic
> :cTableName := ClPara5
> :Create()
> END
> clsqldestino:lOpen:=.T.
>
> Do While !eof()
> IF CLPARA2='QUEJASD.CSV'
>
> -- EN ESTA LINEA DA EL ERROR
> clFOund=iif(CLSQLDESTINO:locate("CLIENTE='"+mCliente+"' AND
> CODIGO='"+mCodigo+"'"),.t.,.f.)
> --
> ENDIF
> .....------------------------------------------------------- ------------------------------------------------------------ -
>
>
>

Error al usar Metodo LOCATE con mas de 1 campo.

Publicado: Sab May 26, 2007 4:59 am
por Fernando Hernandez
Buenas Noches
Siguiendo con la busqueda con Ado, perdon por el mensaje anterior, el metodo
que acepta varios campos es el SEEK y no el FIND como incorrectamente habia
escrito, pero su uso (SEEK) depende del proveedor de la base de datos.
------------------------------------------------------------ ------------------------------------------------------------ -----------------------------------------
METHOD: Recordset::Seek
------------------------------------------------------------ --------------------
recordsetobject.Seek KeyValues, SeekOption
The Seek method uses the provider to search using indexes to find a Record
in a Recordset that matches the values specified in the KeyValues parameter.
If a match occurs, the current record pointer will point to the matching
record or where specified by the SeekOption parameter. If no match occurs,
the current record pointer will be placed at the end of the Recordset.
Very few providers support this method. The provider must support this
method and the use of indexes on the Recordset (see the Index property).
This method can only be used with server-side cursors.
------------------------------------------------------------ ------------------------------------------------------------ -----------------------------------------
He visto en los fuentes el metodo LOCATE en adorecords.prg y veo que invoca
el metodo FIND de ado, adjunto parte de un texto que he encontrado sobre
este metodo (solo para ilustrar mi problema con los demas usuarios del
foro). Existiria la posibilidad de agregar el metodo SEEK de ado, o en el
peor de los casos se que tendré que usar el metodo FILTER para determinar si
ya existe un registro en la base de datos antes de invocar el Metodo ADDNEW.
Saludos
------------------------------------------------------------ ------------------------------------------------------------ -----------------------------------------
METHOD: Recordset::Find
------------------------------------------------------------ --------------------
recordsetobject.Find Criteria, SkipRecords, SearchDirection, Start
The Find method is used to search a Recordset for a Record that matches the
search criteria (a search string). This method will work if the Recordset
supports bookmarks. If the search is successful, the current record pointer
will be moved to point to the first Record that matches. If the search
fails, the Recordset will point to either EOF or BOF.
There is one mandatory and three optional parameters.
The mandatory Criteria parameter is a string that defines the search
criteria. This string must contain one field (column) name, one comparison
operator, and a search value.
You can only search on one field (column).
The comparison operators in Criteria can only be one of the following:
= > >= < <= <> LIKE
You cannot use OR or AND.
------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------
"Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
news:[email=46575476@ozsrv2.ozlan.local...]46575476@ozsrv2.ozlan.local...[/email]
> Solo para agregar algo, antes de comenzar a desarrollar en Xailer el
> software de Backoffice para la pocket PC, habia comenzado algo en Minigui
> y xHarbour, lo que si recuerdo es que el metodo LOCATE de ado no me
> funciono por lo que termine usando el metodo FIND, que si me permite
> evaluar varios campos, podria ser posible agregar este metodo a la clase
> TSQLTABLE.
>
> En espera de sus comentarios.
>
> "Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
> news:[email=465752db@ozsrv2.ozlan.local...]465752db@ozsrv2.ozlan.local...[/email]
>> Buenas Tardes
>>
>> Estos con una rutina para poder incorporar la informacion de la pocket ya
>> directamente a la base de datos en Oracle, pues bien uso el metodo
>> locate, pero no me esta evaluando cuando le paso mas de 2 campos a
>> comparar. con uno me funciona correcto. La informacion la leo de una
>> tabla DBF. Existe algun problema en este metodo al evaluar mas de 1 campo
>> ?? Adjunto pantalla con el error mostrado tambien; sin embargo luego de
>> mostrar el error, el programa continua con la rutina.
>>
>> En espera de sus comentarios.
>>
>> Adjunto parte del codigo.
>>
>> ------------------------------------------------------------ -----------------------------------------------------------
>> WITH OBJECT clsqldestino := TSQLTable():New()
>> :oDataSource := clSqlAdo
>> :cProcess := "GENERAL"
>> :nCursorType := adOpenDynamic
>> :nLockType := adLockOptimistic
>> :cTableName := ClPara5
>> :Create()
>> END
>> clsqldestino:lOpen:=.T.
>>
>> Do While !eof()
>> IF CLPARA2='QUEJASD.CSV'
>>
>> -- EN ESTA LINEA DA EL ERROR
>> clFOund=iif(CLSQLDESTINO:locate("CLIENTE='"+mCliente+"' AND
>> CODIGO='"+mCodigo+"'"),.t.,.f.)
>> --
>> ENDIF
>> .....------------------------------------------------------- ------------------------------------------------------------ -
>>
>>
>>
>
>

Error al usar Metodo LOCATE con mas de 1 campo.

Publicado: Sab May 26, 2007 5:34 am
por Fernando Hernandez
Ok,
asi lo he dejado, solo para informacion del grupo .
------------------------------------------------------------ --------------------------------------------
IF CLPARA2='QUEJASD.CSV'
clFiltro="cliente='"+CLIENTE+"' and codigo='"+CODIGO+"' and
fecha='"+FECHA+"'"
ENDIF
clSqlDestino:filter("&clFiltro")
if clSqlDestino:Eof() .or. ClSqlDestino:bof()
clsqldestino:Addnew()
...Campos a Actualizar
clsqdestino:Update()
endif
------------------------------------------------------------ --------------------------------------------
Saludos
"Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
news:4657a138$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Buenas Noches
>
> Siguiendo con la busqueda con Ado, perdon por el mensaje anterior, el
> metodo que acepta varios campos es el SEEK y no el FIND como
> incorrectamente habia escrito, pero su uso (SEEK) depende del proveedor de
> la base de datos.
>
> ------------------------------------------------------------ ------------------------------------------------------------ -----------------------------------------
> METHOD: Recordset::Seek
>
> ------------------------------------------------------------ --------------------
>
> recordsetobject.Seek KeyValues, SeekOption
>
> The Seek method uses the provider to search using indexes to find a Record
> in a Recordset that matches the values specified in the KeyValues
> parameter. If a match occurs, the current record pointer will point to the
> matching record or where specified by the SeekOption parameter. If no
> match occurs, the current record pointer will be placed at the end of the
> Recordset.
>
> Very few providers support this method. The provider must support this
> method and the use of indexes on the Recordset (see the Index property).
> This method can only be used with server-side cursors.
> ------------------------------------------------------------ ------------------------------------------------------------ -----------------------------------------
>
> He visto en los fuentes el metodo LOCATE en adorecords.prg y veo que
> invoca el metodo FIND de ado, adjunto parte de un texto que he encontrado
> sobre este metodo (solo para ilustrar mi problema con los demas usuarios
> del foro). Existiria la posibilidad de agregar el metodo SEEK de ado, o en
> el peor de los casos se que tendré que usar el metodo FILTER para
> determinar si ya existe un registro en la base de datos antes de invocar
> el Metodo ADDNEW.
>
> Saludos
>
> ------------------------------------------------------------ ------------------------------------------------------------ -----------------------------------------
> METHOD: Recordset::Find
>
>
> ------------------------------------------------------------ --------------------
>
> recordsetobject.Find Criteria, SkipRecords, SearchDirection, Start
>
> The Find method is used to search a Recordset for a Record that matches
> the search criteria (a search string). This method will work if the
> Recordset supports bookmarks. If the search is successful, the current
> record pointer will be moved to point to the first Record that matches. If
> the search fails, the Recordset will point to either EOF or BOF.
>
> There is one mandatory and three optional parameters.
>
> The mandatory Criteria parameter is a string that defines the search
> criteria. This string must contain one field (column) name, one comparison
> operator, and a search value.
>
> You can only search on one field (column).
>
> The comparison operators in Criteria can only be one of the following:
>
> = > >= < <= <> LIKE
>
> You cannot use OR or AND.
> ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------
>
>
> "Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
> news:[email=46575476@ozsrv2.ozlan.local...]46575476@ozsrv2.ozlan.local...[/email]
>> Solo para agregar algo, antes de comenzar a desarrollar en Xailer el
>> software de Backoffice para la pocket PC, habia comenzado algo en Minigui
>> y xHarbour, lo que si recuerdo es que el metodo LOCATE de ado no me
>> funciono por lo que termine usando el metodo FIND, que si me permite
>> evaluar varios campos, podria ser posible agregar este metodo a la clase
>> TSQLTABLE.
>>
>> En espera de sus comentarios.
>>
>> "Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
>> news:[email=465752db@ozsrv2.ozlan.local...]465752db@ozsrv2.ozlan.local...[/email]
>>> Buenas Tardes
>>>
>>> Estos con una rutina para poder incorporar la informacion de la pocket
>>> ya directamente a la base de datos en Oracle, pues bien uso el metodo
>>> locate, pero no me esta evaluando cuando le paso mas de 2 campos a
>>> comparar. con uno me funciona correcto. La informacion la leo de una
>>> tabla DBF. Existe algun problema en este metodo al evaluar mas de 1
>>> campo ?? Adjunto pantalla con el error mostrado tambien; sin embargo
>>> luego de mostrar el error, el programa continua con la rutina.
>>>
>>> En espera de sus comentarios.
>>>
>>> Adjunto parte del codigo.
>>>
>>> ------------------------------------------------------------ -----------------------------------------------------------
>>> WITH OBJECT clsqldestino := TSQLTable():New()
>>> :oDataSource := clSqlAdo
>>> :cProcess := "GENERAL"
>>> :nCursorType := adOpenDynamic
>>> :nLockType := adLockOptimistic
>>> :cTableName := ClPara5
>>> :Create()
>>> END
>>> clsqldestino:lOpen:=.T.
>>>
>>> Do While !eof()
>>> IF CLPARA2='QUEJASD.CSV'
>>>
>>> -- EN ESTA LINEA DA EL ERROR
>>> clFOund=iif(CLSQLDESTINO:locate("CLIENTE='"+mCliente+"' AND
>>> CODIGO='"+mCodigo+"'"),.t.,.f.)
>>> --
>>> ENDIF
>>> .....------------------------------------------------------- ------------------------------------------------------------ -
>>>
>>>
>>>
>>
>>
>
>

Error al usar Metodo LOCATE con mas de 1 campo.

Publicado: Sab May 26, 2007 1:47 pm
por ignacio
Fernado,
Estoy convencido que es simplemente un problema del driver ADO de Oracle que
sencillamente no lo soporta. Prueba a realizar un filtro.
Un saludo
"Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
news:[email=465752db@ozsrv2.ozlan.local...]465752db@ozsrv2.ozlan.local...[/email]
> Buenas Tardes
>
> Estos con una rutina para poder incorporar la informacion de la pocket ya
> directamente a la base de datos en Oracle, pues bien uso el metodo
> locate, pero no me esta evaluando cuando le paso mas de 2 campos a
> comparar. con uno me funciona correcto. La informacion la leo de una tabla
> DBF. Existe algun problema en este metodo al evaluar mas de 1 campo ??
> Adjunto pantalla con el error mostrado tambien; sin embargo luego de
> mostrar el error, el programa continua con la rutina.
>
> En espera de sus comentarios.
>
> Adjunto parte del codigo.
>
> ------------------------------------------------------------ -----------------------------------------------------------
> WITH OBJECT clsqldestino := TSQLTable():New()
> :oDataSource := clSqlAdo
> :cProcess := "GENERAL"
> :nCursorType := adOpenDynamic
> :nLockType := adLockOptimistic
> :cTableName := ClPara5
> :Create()
> END
> clsqldestino:lOpen:=.T.
>
> Do While !eof()
> IF CLPARA2='QUEJASD.CSV'
>
> -- EN ESTA LINEA DA EL ERROR
> clFOund=iif(CLSQLDESTINO:locate("CLIENTE='"+mCliente+"' AND
> CODIGO='"+mCodigo+"'"),.t.,.f.)
> --
> ENDIF
> .....------------------------------------------------------- ------------------------------------------------------------ -
>
>
>

Error al usar Metodo LOCATE con mas de 1 campo.

Publicado: Sab May 26, 2007 1:49 pm
por ignacio
Fernando,
El método FIND de ADO sólo funciona con tablas de acceso directo,
básicamente DBFs y Access. Hace poco hubo un hilo al respecto en el cual se
explicaba su poca o nula utilidad.
Un saludo,
"Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
news:[email=46575476@ozsrv2.ozlan.local...]46575476@ozsrv2.ozlan.local...[/email]
> Solo para agregar algo, antes de comenzar a desarrollar en Xailer el
> software de Backoffice para la pocket PC, habia comenzado algo en Minigui
> y xHarbour, lo que si recuerdo es que el metodo LOCATE de ado no me
> funciono por lo que termine usando el metodo FIND, que si me permite
> evaluar varios campos, podria ser posible agregar este metodo a la clase
> TSQLTABLE.
>
> En espera de sus comentarios.
>
> "Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
> news:[email=465752db@ozsrv2.ozlan.local...]465752db@ozsrv2.ozlan.local...[/email]
>> Buenas Tardes
>>
>> Estos con una rutina para poder incorporar la informacion de la pocket ya
>> directamente a la base de datos en Oracle, pues bien uso el metodo
>> locate, pero no me esta evaluando cuando le paso mas de 2 campos a
>> comparar. con uno me funciona correcto. La informacion la leo de una
>> tabla DBF. Existe algun problema en este metodo al evaluar mas de 1 campo
>> ?? Adjunto pantalla con el error mostrado tambien; sin embargo luego de
>> mostrar el error, el programa continua con la rutina.
>>
>> En espera de sus comentarios.
>>
>> Adjunto parte del codigo.
>>
>> ------------------------------------------------------------ -----------------------------------------------------------
>> WITH OBJECT clsqldestino := TSQLTable():New()
>> :oDataSource := clSqlAdo
>> :cProcess := "GENERAL"
>> :nCursorType := adOpenDynamic
>> :nLockType := adLockOptimistic
>> :cTableName := ClPara5
>> :Create()
>> END
>> clsqldestino:lOpen:=.T.
>>
>> Do While !eof()
>> IF CLPARA2='QUEJASD.CSV'
>>
>> -- EN ESTA LINEA DA EL ERROR
>> clFOund=iif(CLSQLDESTINO:locate("CLIENTE='"+mCliente+"' AND
>> CODIGO='"+mCodigo+"'"),.t.,.f.)
>> --
>> ENDIF
>> .....------------------------------------------------------- ------------------------------------------------------------ -
>>
>>
>>
>
>

Error al usar Metodo LOCATE con mas de 1 campo.

Publicado: Lun May 28, 2007 5:55 pm
por Fernando Hernandez
Buenas a todos, tal como le comente en un mensaje antes de este, al final me
toco usar un filtro para evaluar la existencia de un registro; al inicio
tenia un poco de duda sobre la velocidad pero al probar sobre una tabla de
mas de 400,000 registro y con una conexion remota al server el tiempo de
respuesta fue de menos de 1 segundo lo cual considero muy aceptable.
Espero que mis comentarios ayuden a otros usuarios que tambien piensen o
esten trabajando sobre un servidor de Oracle.
Saludos
"Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje
news:46581e56$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Fernado,
>
> Estoy convencido que es simplemente un problema del driver ADO de Oracle
> que sencillamente no lo soporta. Prueba a realizar un filtro.
>
> Un saludo
>
> "Fernando Hernandez" <dbfer@dilico.com.sv> escribió en el mensaje
> news:[email=465752db@ozsrv2.ozlan.local...]465752db@ozsrv2.ozlan.local...[/email]
>> Buenas Tardes
>>
>> Estos con una rutina para poder incorporar la informacion de la pocket ya
>> directamente a la base de datos en Oracle, pues bien uso el metodo
>> locate, pero no me esta evaluando cuando le paso mas de 2 campos a
>> comparar. con uno me funciona correcto. La informacion la leo de una
>> tabla DBF. Existe algun problema en este metodo al evaluar mas de 1 campo
>> ?? Adjunto pantalla con el error mostrado tambien; sin embargo luego de
>> mostrar el error, el programa continua con la rutina.
>>
>> En espera de sus comentarios.
>>
>> Adjunto parte del codigo.
>>
>> ------------------------------------------------------------ -----------------------------------------------------------
>> WITH OBJECT clsqldestino := TSQLTable():New()
>> :oDataSource := clSqlAdo
>> :cProcess := "GENERAL"
>> :nCursorType := adOpenDynamic
>> :nLockType := adLockOptimistic
>> :cTableName := ClPara5
>> :Create()
>> END
>> clsqldestino:lOpen:=.T.
>>
>> Do While !eof()
>> IF CLPARA2='QUEJASD.CSV'
>>
>> -- EN ESTA LINEA DA EL ERROR
>> clFOund=iif(CLSQLDESTINO:locate("CLIENTE='"+mCliente+"' AND
>> CODIGO='"+mCodigo+"'"),.t.,.f.)
>> --
>> ENDIF
>> .....------------------------------------------------------- ------------------------------------------------------------ -
>>
>>
>>
>
>