FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ren茅 u otro usuario :ver soluci贸n al final
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Ren茅 u otro usuario :ver soluci贸n al final
Posted: Thu Aug 30, 2007 10:16 PM
A ver:
Tengo el siguiente c贸digo:
            temporal->(dbGotop())
            //aDatos:=AddRegistro( "DET_NOTA_VENTA")
            DO WHILE !temporal->(Eof())
               aDatos:=AddRegistro( "DET_NOTA_VENTA")
               IF aDatos[1]
                  aDatos[3]:AddNew()
                  aDatos[3]:Fields( "idnotadeventa"):value:=nIdNotadeVenta
                  aDatos[3]:Fields( "idproducto"):value:=temporal->idproducto
                  aDatos[3]:Fields( "pventa"):value:=temporal->pventa
                  aDatos[3]:Fields( "cantidad"):value:=temporal->cantidad
                  aDatos[3]:Fields( "total"):value:=temporal->total
                  TRY
                     aDatos[3]:Update()
                  CATCH oError
                     MsgStop( oError:Description, "Error")
                  END
                  TRY
                     aDatos[3]:Close()
                  CATCH oError
                     lError:=.T.
                     MsgStop( "Se ha producido un error al agregar el Detalle", "ERROR:Linea 992")
                  END
                  aDatos[2]:Close()
               ELSE
                  aDatos[2]:Close()
                  MsgStop( "Se ha producido un error al agregar el Detalle", "ERROR:Linea 997")
                  lError:=.T.
               ENDIF
               IF lError
                  EXIT
               ENDIF
               temporal->(dbSkip())
            ENDDO
            /*aDatos[3]:Update()
            TRY
               aDatos[3]:Close()
            CATCH oError
               lError:=.T.
               MsgStop( "Se ha producido un error al agregar el Detalle", "ERROR:Linea 1022")
            END
            aDatos[2]:Close()*/


脡ste es el c贸digo de la funci贸n AddRegistro(cTabla):
FUNCTION AddRegistro( cTabla)
   LOCAL lOK:=.T., aResultados:=Array(3)
   LOCAL oCon, oError, oDatos

   TRY
      oCon:=toleauto():new("adodb.connection")
   CATCH oError
      MsgStop( "L铆nea 125: Error al crear la conexi贸n" + CRLF + ;
               "Sql()", "rutinasdeconexion.prg")
      lOK:=.F.
   END
   IF lOk
      oCon:ConnectionString:="Provider=OraOLEDB.Oracle;Data Source=192.168.0.150:1521/xe;User ID=usuario;Password=password;"
      oCon:ConnectionTimeout:=3600
      TRY
         oCon:Open()
      CATCH oError
         lOK:=.F.
      END
      IF lOk
         TRY
            oDatos:=TOleAuto():New("adodb.recordset")
         CATCH oError
            lOK:=.F.
            oDatos:=NIL
         END
         IF lOk
            oDatos:CursorLocation  := adUseClient //adUseServer
            //oDatos:CursorLocation  := adUseServer
            oDatos:LockType := adLockOptimistic
            oDatos:CursorType := adOpenKeyset
            oDatos:Source := cTabla
            oDatos:ActiveConnection(oCon)
            TRY
               oDatos:Open()
            CATCH oError
               lOK:=.F.
            END
         ENDIF
      ENDIF
   ENDIF
   aResultados[1]:=lOk
   aResultados[2]:=oCon
   aResultados[3]:=oDatos
RETURN aResultados

Mi Problema:
1.- Cuando agrego un 煤nico registro el proceso funciona espectacular!!.
2.- Si este mismo proceso lo realiza para m谩s de un registro que tenga en una .DBF se cae y solamente me guarda en el servidor el primer registro. O sea, cuando utilizo el :addnew() m谩s de una vez, el :update() falla.
3.- Intent茅 colocando la llamada a la funci贸n fuera del do while y solamente utilizando el addnew() y el update() dentro del do while y fall贸.
4.- Intent茅 lo mismo que en el punto 3, pero colocando el update() despu茅s del do while e igual se cae.

Intent茅 jugando con los valores de oDatos:CursorLocation y nada.

Agradecer茅 si me pueden ayudar. Debo estar pasando algo por alto.

Saludos y gracias
David Lagos S.
Coquimbo-Chile
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
Posts: 840
Joined: Thu Oct 13, 2005 07:05 PM
Ren茅 u otro usuario :ver soluci贸n al final
Posted: Fri Aug 31, 2007 02:37 AM

Lo que no entiendo es porque cierras el RecordSet ?????

Por eso solo puedes meter un solo registro, si depues del hacer el ::AddNew(), hacer la asignaci贸n de variables, y luego ::Update(), estoy viendo que haces un ::Close(), si cierras el record set YA NO EXISTE, luego entonces no puedes agregar nada mas a el.

Solucion, NO CIERRES EL RECORDSET hasta despu茅s del ENDDO.

Saludos

R.F.
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Ren茅 u otro usuario :ver soluci贸n al final
Posted: Fri Aug 31, 2007 03:28 AM
RF wrote:Lo que no entiendo es porque cierras el RecordSet ?????

Por eso solo puedes meter un solo registro, si depues del hacer el ::AddNew(), hacer la asignaci贸n de variables, y luego ::Update(), estoy viendo que haces un ::Close(), si cierras el record set YA NO EXISTE, luego entonces no puedes agregar nada mas a el.

Solucion, NO CIERRES EL RECORDSET hasta despu茅s del ENDDO.


Gracias Ren茅 por tu ayuda.

脡ste es el browse antes del error:


y esta es la imagen del error con el browse de fondo.


Esta es la imagen del error.log:


Hice lo que me indicas y no result贸. As铆 dej茅 el c贸digo:
temporal->(dbGotop())
aDatos:=AddRegistro( "DET_NOTA_VENTA")
DO WHILE !temporal->(Eof())
   aDatos[3]:AddNew()
   aDatos[3]:Fields( "idnotadeventa"):value:=nIdNotadeVenta
   aDatos[3]:Fields( "idproducto"):value:=temporal->idproducto
   aDatos[3]:Fields( "pventa"):value:=temporal->pventa
   aDatos[3]:Fields( "cantidad"):value:=temporal->cantidad
   aDatos[3]:Fields( "total"):value:=temporal->total
   aDatos[3]:Update()
   temporal->(dbSkip())
ENDDO
aDatos[3]:Close()
aDatos[2]:Close()


En la parte del Fields(cNombrecampo):=valor intent茅 con Fields(0):=valor y tampoco result贸.

Si te fijas tengo lo siguiente antes del do while:
aDatos:=AddRegistro( "DET_NOTA_VENTA")

Esa funci贸n (c贸digo completo en el post anterior) crea el objeto conexi贸n y el objeto recordset de ado y me deja en condiciones de utilizar el :addnew() y el :update().
El objeto conexi贸n regresa a m铆 en aDatos[2] y el objeto recordset regresa en aDatos[3]. aDatos[1] solamente tiene un valor l贸gico que me indica si tuvo 茅xito la funci贸n en abrir el objeto conexi贸n y el objeto recordset. Y luego del ENDDO sencillamente cierro la conexi贸n al recordset (aDatos[3]) y al objeto conexi贸n de ado (aDatos[2]).

O sea; haciendo lo que t煤 me indicas que es abriendo el recordset antes del DO WHILE y cerr谩ndolo despu茅s del ENDDO tampoco funciona.

驴Puedes poner atenci贸n al c贸digo que est谩 m谩s abajo (FUNCTION AddRegistro( cTabla) del post anterior, e indicarme si todo est谩 bi茅n?, en especial esta parte:
oDatos:CursorLocation  := adUseClient //adUseServer
//oDatos:CursorLocation  := adUseServer
oDatos:LockType := adLockOptimistic
oDatos:CursorType := adOpenKeyset
oDatos:Source := cTabla
oDatos:ActiveConnection(oCon)
TRY
   oDatos:Open()
CATCH oError
   lOK:=.F.
END

Infinitas gracias Ren茅
David
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Ren茅 u otro usuario :ver soluci贸n al final
Posted: Fri Aug 31, 2007 02:32 PM

Podr铆a ser un tema puntual con oracle? y eso que utilizo el proveedor oledb de oracle.
David

David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM
Ren茅 u otro usuario :ver soluci贸n al final
Posted: Fri Aug 31, 2007 08:26 PM

La soluci贸n fue muy simple:
Esta tabla que me daba el error es del detalle de las notas de ventas y el administrador no hay贸 nada mejor que asignar al idnotadeventa como llave primaria. Y todos sabemos que una llave primaria no se puede repetir. El administrador no tom贸 en cuenta el modelo de datos que le entregu茅.
Ahora me r铆o. Anoche estuve hasta como las 4 am revent谩ndome la cabeza.
Bueno espero que igual esto le sirva a alguien.
Saludos

David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl

Continue the discussion