Page 1 of 1

ADO AddNew

PostPosted: Thu Nov 23, 2006 11:43 am
by Biel EA6DD
Hola a todos.
Hace unas semanas he empezado a trabajar con ADO, tengo una duda (bueno tengo mas de una).
Estoy visualizando un recordset con un txbrowse, dicho recordset por su naturaleza no me permite ejecutar AddNew.

Cual seria la manera mas eficiente y comoda para realizar un alta.
1.- Ejecutar un insert con el metodo Execute del objeto connection.
2.- Lo mismo que antes pero con el objeto command
3.-Crear otro recordset con solo los campos de la tabla en cuestion y me permita hacer AddNew. Esta segunda parece mas comoda, pero que source le pongo, si realmente no me interesa me recupere ningun registro¿?. O puedo poner el cursor en el lado del cliente y asi no descarga registros ?¿ o ...?¿
4.- ...

Please opiniones de los expertos, gracias anticipadas.

PostPosted: Thu Nov 23, 2006 8:20 pm
by Rochinha
HOla

Mira:

Inserir registro:

Code: Select all  Expand view
    oRs:AddNew()
    oRs:Fields( "id" ):Value         := "00001"
    oRs:Fields( "nombre" ):Value := "JOSE CARLOS DA ROCHA"
    oRs:Fields( "apelido" ):Value  := "ROCHINHA"
    oRs:Fields( "pais" ):Value       := "BRASIL"
    oRs:Update() // Actualiza o recordset


Alterar registro:

Code: Select all  Expand view
    oRs:Fields( "id" ):Value         := "00001"
    oRs:Fields( "nombre" ):Value := "JOSE CARLOS DA ROCHA"
    oRs:Fields( "apelido" ):Value  := "ROCHINHA"
    oRs:Fields( "pais" ):Value       := "BRASIL"
    oRs:Update() // Actualiza o recordset


Borrar registro:

Code: Select all  Expand view
    oRs:Delete()
    oRs:ReQuery() // opcional


Ok?

PostPosted: Fri Nov 24, 2006 8:23 am
by Biel EA6DD
Gracias Rochinha, pero eso no es exactamente lo que estaba preguntando. Yo ya conozco los metodos para altas bajas y modificaciones. El problema es que el browse esta basado sobre un recordset (oRS) no editable. Y la pregunta, es cual seria el metodo mas rapido para dar el alta. Otro recordset que permita addnew, inser con execute, ...

PostPosted: Fri Nov 24, 2006 2:06 pm
by Rochinha
Amigo

Lo recordset esta basado en que tipo de BD?

Yo trabajo en modo local, cliente.

Revisa se la abertura es ReadOnly

Code: Select all  Expand view
LOCAL oConn := TOLEAUTO():New("adodb.connection")
PRIVATE oRecordset := TOLEAUTO():New("adodb.recordset")

   oConn:Open("Provider= MicroSoft.Jet.OLEDB.4.0;Data Source=.\arquivo.mdb;")

   oRecordSet:LockType := adLockOptimistic // adLockReadOnly
   oRecordSet:CursorType := adOpenKeyset
   oRecordSet:ActiveConnection(oConn)
   oRecordSet:Source := "Select * from clientes" // tu query aqui
   oRecordSet:Open()
   oRecordSet:MoveFirst()

   aDatos := {}

   DO WHILE ! oRecordSet:eof()
        aReng := {}
        FOR x := 1 TO oRecordSet:Fields:Count()
            AADD(aReng,oRecordSet:Field(x-1):Value
        NEXT
        AADD(aDatos,aReng)
        oRecordSet:MoveNext
   ENDDO

   oRecordSet:Close()
   oConn:Close()


Saludos

PostPosted: Fri Nov 24, 2006 3:00 pm
by Biel EA6DD
El recordset ataca una bases de datos DB2, y el source es
Code: Select all  Expand view
cSql:= "SELECT EmpCod,Anyo,NumPed,Fecha,Hora,Usr,NetName,Servir,CliCod,Obs1,Obs2,"+;
"Servido,Presu,Kilos,Ava3Tx,Ava4Tx,Ava6Tx,Ava7Tx,Ava8Tx,Ava9Tx,Avbatx,AvbCtx,AvbDtx"+;
" FROM (SELECT PedCab.EmpCod AS TotEmp, PedCab.Anyo as TotAny, PedCab.NumPed as TotNum,"+;
" SUM(UDS*PESO) AS KILOS FROM PEDCAB LEFT JOIN PEDDET ON PEDCAB.EMPCOD= PEDDET.EMPCOD AND"+;
" PEDCAB.ANYO=PEDDET.ANYO AND PEDCAB.NUMPED=PEDDET.NUMPED GROUP BY"+;
" PEDCAB.EMPCOD, PEDCAB.ANYO, PEDCAB.NUMPED) AS TOTAL, " +;
" PedCab LEFT JOIN PiCliep ON EmpCod=Avaccd AND CliCod=Ava4cd"+;
" WHERE PedCab.EmpCod=Total.TotEmp AND PedCab.Anyo=Total.TotAny AND PedCab.NumPed=Total.TotNum"


Este recordset no me perimite hacer AddNew(supongo que por el join , o por alguna otra cosa, no por el tipo de cursor, ni tipo de blouqeo), entonces debo utilizar otro recordset sobre la tabla base PedCab, o capturar los datos en variables y volcarlos con excute "insert ... ", y la pregunta cual es el metodo mejor.

PD. Los nombre de atributos son rarillos porque la tabla clientes fue creada con una herammienta Case que maneja diccionario de datos, y les pone estos nombres tan chulos y a la vez descriptivos :D (Ava3Tx,Ava4Tx,Ava6Tx...)

PostPosted: Sat Nov 25, 2006 6:02 am
by Rochinha
Si

Entonces debes usar INSERT pois con ele tu iras referenciar la tabla alvo mas directamente.