Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-12-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Question Trabajar con DATASET Manualmente

Hola amigo del foro me gustaria saber insertar,eliminar,Editar atraves de un dataset en mi caso utilizo los componentes Zeos (TZQuery)para hacerlo,lo he hecho siempre utilizando las funcionalidades del componente TDBNavigator pero me gustaria hacerlo yo manualmente y no utilizando ya sea DBEdit o DBGrid sino pasarle los registro yo mismo.
Para serles franco siempre he tenido duda de como hace el DataSet internamente para insertar,eliminar,editar,seleccionar, los regitros en BD ya que cuando lo haces utilizando un DBNavigator que a su ves utiliza los metodos que tiene el DataSet como Insert,Edit,Delete,etc, nosotros ni siquiera hacemos consultas SQL si no que estos propio metodos ya lo hacen por ti, y esa es my duda ¿De donde sacan los datos para guardarlos?¿Tienen acaso variables auxiliares que utilizan ? ¿Si es asi sera que puedo acceder a estas variable para que yo mismo les pueda asignar valores y luego trabajar con ellos?
Espero que me ayuden a hacerme entender este proceso.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #2  
Antiguo 29-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola rgstuamigo,
¿Podrías aclarar mejor tu duda? No termino de comprender el motivo por el cual deseas implementar tus propios Insertar, Editar, etc que ya ofrece el DataSet (al menos eso es lo que entiendo de tu post).

El DBNavigator lo que hace internamente llamar a los métodos Insert, Edit, etc.. del DataSet asociado.
Por otro lado el TDataSet mantiene un "buffer" con los datos. Los métodos aprovechan ese Buffer para moverse por los "registros" y aplicar las funciones necesarias. Luego, cuando es necesario los datos de dicho Buffer se envían al motor para confirmar la acción.
De manera simple así es como funciona.

Por otro lado, si lo que estás buscando es acceder a los registro eso se puede hacer de muchas formas. Todo descendiente de TDataSet (TTable, TQuery, TIBTable, TADOTable, etc) cuenta con métodos y propiedades para acceder al registro actual:

Código Delphi [-]
FieldByName()
Fields[]

Y si hacemos uso de campos persistentes algo como esto:

Código Delphi [-]
NombreDataSetNombreCampo.Value := ...

Ahora para moverse de un registro a otro se cuenta con Next, Prior, Last, First.

Si tu duda pasa por acceder los registros, y campos se procede de este modo.
Sería útil que puntualices y afines mejor tu duda.
Por cierto: no se debería hacer uso de TDataSet sino de los descendiente de éste. Cada descendiente ofrece los mecanismos adecuados para trabajar de forma adecuada. TDataSet solo es la clase abstracta.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 29-12-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Question

Gracias Delphius por responder,
Cita:
Por otro lado el TDataSet mantiene un "buffer" con los datos. Los métodos aprovechan ese Buffer para moverse por los "registros" y aplicar las funciones necesarias. Luego, cuando es necesario los datos de dicho Buffer se envían al motor para confirmar la acción.
De manera simple así es como funciona.
Por Ahi mas o menos va la cosa.
Pero haber me voy a explicar un poquito mejor.con esta preguntita.

¿Como podriamos hacer para insertar (utilizando el metodo Insert del Dataset) datos en la BD pero sin utilizar otros componentes, sino hacerlo todo por codigo.? no se si podrias hacerme un ejemplo.esa es mi duda.....
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #4  
Antiguo 29-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por rgstuamigo Ver Mensaje
Gracias Delphius por responder,
Por Ahi mas o menos va la cosa.
Pero haber me voy a explicar un poquito mejor.con esta preguntita.

¿Como podriamos hacer para insertar (utilizando el metodo Insert del Dataset) datos en la BD pero sin utilizar otros componentes, sino hacerlo todo por codigo.? no se si podrias hacerme un ejemplo.esa es mi duda.....
¿A qué te refieres con "sin utilizar otros componentes", "hacerlo todo por código"?

La verdad es que ahora te entiendo menos que antes. ¿A qué viene todo ésto? ¿Evitarse componentes data-wares? Si la respuesta es afirmativa al último interrogante es muy simple:

Empleando los métodos y propiedades que te he comentado antes. Los componentes data-ware son "opcionales". Si haces uso de ellos bien, sino también. Lo que pasa es que esos componentes te facilitan las cosas, enganchando todo en ejecución. Por código, a mano es otro tema.

¿Ejemplo? Pues a mi se me ocurre emplear un TQuery o uno análogo a un Query, por ejemplo: TIBQuery.

Código Delphi [-]
IBQuery1.Close;
IBQuery1.SQL.Clear;
// armo el SQL
with IBQuery1.SQL do
  begin
    Add('INSERT INTO TABLA');
    Add('VALUES(:Nombre, :Edad, ...)');
  end;
// Le indico los parámetros
with IBQuery1.Params do
   begin 
   ParamByName('Nombre').AsString := EditNombre.Text;
   ParamByName('Edad').AsInteger := StrToInt(EditEdad.Text);
   ...
   end;
// ejecuto la SQL
IBQuery1.Execsql;

Me gustaría que seas más descriptivo en tu caso. Cuanto más nos sepas decir sobre tu duda, problema, inquietud (y por sobre todo que componentes y que motor de base de datos usas) te podremos ser de ayuda.

Repito nuevamente: NO se debe usar TDataSet, sino los descendientes de éste.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 29-12-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Código Delphi [-]
IBQuery1.Close;
IBQuery1.SQL.Clear;
// armo el SQL
with IBQuery1.SQL do
  begin
    Add('INSERT INTO TABLA');
    Add('VALUES(:Nombre, :Edad, ...)');
  end;
// Le indico los parámetros
with IBQuery1.Params do
   begin 
   ParamByName('Nombre').AsString := EditNombre.Text;
   ParamByName('Edad').AsInteger := StrToInt(EditEdad.Text);
   ...
   end;
// ejecuto la SQL
IBQuery1.Execsql;
Bueno es lo mismo que hago asi como lo estas haciendo , a lo que me referia era a que como hace el dataset para insertar los registros utilizando el metodo Insert ¿De donde saca los datos para insertar? ya que el metodo Insert no tiene parametros de entradas (ZQuery1.Insert);Me estabas hablando de que utiliza un Buffer y aqui viene la pregunta ¿sera que tambien puedo insertar de esta forma?

Código Delphi [-]
poner al buffer el campo1.//Aqui pongo el campo 1 de mi tabla
poner al buffer el campo2.//Aqui pongo el campo 2 de mi tabla
..
.
.
.
ZQuery.Insert;
Esto es mi duda y quisiera que me lo aclaran si se puede de esta forma insertar,editar,eliminar. Para ahorrarme hacer sentencias SQL.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #6  
Antiguo 29-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Pues no se puede.
Y es precisamente para evitarse esos dolores de cabeza que empleamos los métodos.
TDataSet nos oculta ese tedioso manejo del buffer y nos hace el trabajo de forma transparente. No vemos ese Buffer porque simplemente el componente, y toda su jerarquía de clases está tan bien diseñada para ocultar los detalles técnicos que son "irrelevantes" al programador final.

¡Vamos que lo buscas hacer es ir a lo primitivo; rompe con el esquema y las bondades de OO: encapsulamiento de información y falicidad de programación!

Por cierto, el método Insert (el cual pertenece a TDataSet) no inserta. Simplemente pone al objeto en estado de insrción (dsInsert).
La inserción no se produce sino es hasta que se confirma con Post.

Puedes ver el bello código del DatSet, y/o de cualquier parte de la VCL tan sólo presionando Ctrl y dando clic en el método, propiedad del objeto.

Fíjate y observarás como internamente se opera con el Buffer y luego se delega la tarea al proveedor, o al motor quien es de última quien hace el trabajo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 29-12-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Pues no se puede.
Y es precisamente para evitarse esos dolores de cabeza que empleamos los métodos.
TDataSet nos oculta ese tedioso manejo del buffer y nos hace el trabajo de forma transparente. No vemos ese Buffer porque simplemente el componente, y toda su jerarquía de clases está tan bien diseñada para ocultar los detalles técnicos que son "irrelevantes" al programador final.
Osea que cada registro que maneja el DataSet no es transparente?
Pues pense que se podia por me dije asi mismo "Por que no aprovechar lo que ya esta hecho y poder utilizarlo"
Incluso vi el metodo Prepare que al parecer prepara que todo este listo.
Tambien vi que se podia hacer esto:
Código Delphi [-]
ZQuery1.Fields.Add(algo);
Parece ser que Adiciona un nuevo Registro(Field)
Entonces para que esto?
¿Que alguien me explique por favor necesito entenderlo?
Cita:
Por cierto, el método Insert (el cual pertenece a TDataSet) no inserta. Simplemente pone al objeto en estado de insrción (dsInsert).
La inserción no se produce sino es hasta que se confirma con Post.
Tienes razon, entonces se podria hacer que primero haga un Insert y Luego un Post y quedaria solucionado en tal caso si se pudiera.
La verdad si alguien puede complementar le estaria muy agradecido.
Gracias amigo Delphius ...
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #8  
Antiguo 29-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por rgstuamigo Ver Mensaje
Osea que cada registro que maneja el DataSet no es transparente?
Pues pense que se podia por me dije asi mismo "Por que no aprovechar lo que ya esta hecho y poder utilizarlo"
Incluso vi el metodo Prepare que al parecer prepara que todo este listo.
Tambien vi que se podia hacer esto:
Código Delphi [-]ZQuery1.Fields.Add(algo);

Parece ser que Adiciona un nuevo Registro(Field)
Entonces para que esto?
¿Que alguien me explique por favor necesito entenderlo?

Tienes razon, entonces se podria hacer que primero haga un Insert y Luego un Post y quedaria solucionado en tal caso si se pudiera.
La verdad si alguien puede complementar le estaria muy agradecido.
Gracias amigo Delphius ...
Saludos...
Disculpa pero en ningún momento he dicho de que no se pueda o no deba trabajar a nivel de registros. Sino que el TDataSet encapsula todo el manejo interno de los registros y sus datos en un Buffer.

El DataSet nos oculta el Buffer, y en vez de ello nos ofrece los métodos bases que luego serán usados y ampliados por las clases descendientes de éste.

Repito nuevamente: no podemos ver el Buffer, pero a cambio de ese buffer tenemos los métodos, propiedades, y clases necesarias para hacernos la tarea más fácil.

Que se pueda añadir un campo al array Fields no viene al caso, eso ya es otra cuestión. ¿Qué no era que estamos hablando de insertar registros y no campos?
Y por si fuera poco, No es un comportamiento normal el que describes, ya que el mismo DataSet se encarga de añadir los campos necesarios en su momento.

Se ofrece ese método puesto que puede ser de utilidad en ciertos casos, pero no son muy frecuentes. El TDataSet llama, internamente a Fields.Add cuando lo necesite. ¿Cuáles son esos casos? La respuesta no podemos generalizar; se necesita analizar caso a caso.

¿A que viene ese giro de tu duda?
Sigues hablando abstractamente, (de igual modo que lo hago yo). Bajemos a tierra mejor. Define una duda concreta y puntual.

¿Quieres una respuesta puntual de cuando se hace uso de Fields.Add?
Un ejemplo es cuando el dataset (un TTable por ejemplo) habre la tabla. Cuando abre la tabla, pide los campos al motor y por cada campo crea un nuevo TField y lo asocia a la lista TFields.
Ahora mismo me imagino un caso, único y raro, en donde se podría necesitar llamar a Fields.Add: crear una tabla en memoria.

Quiero hacerte notar, que lo que estás preguntando son cosas un tanto rebuscadas, y abstractas. Vuelvo a reafirmar mi duda inicial ¿A que viene todo esto?

No se... a lo mejor yo soy el que no comprende el tema.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 29-12-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Talking Solucionado la duda

Cita:
Pues no se puede.
Y es precisamente para evitarse esos dolores de cabeza que empleamos los métodos.
TDataSet nos oculta ese tedioso manejo del buffer y nos hace el trabajo de forma transparente. No vemos ese Buffer porque simplemente el componente, y toda su jerarquía de clases está tan bien diseñada para ocultar los detalles técnicos que son "irrelevantes" al programador final.
Bueno querido Amigo Delphius logre poder hacerlo de manera que queria Aqui esta el codigo por si a alguien le sirve trabajar de esta forma:
Código Delphi [-]
procedure TForm1.robertito1Click(Sender: TObject);
Var q:TZQuery;
begin
  q:=TZQuery.Create(self);
  try
    q.Connection:=ZConnection1;
    q.SQL.Text:='select * from U_Medida Limit 0;';//La tabla a la que voy a insertar
    q.Open;                               //tiene solo dos campos
    q.Insert;
    q.Fields[0].AsInteger:=StrToInt(Edit1.Text);
    q.Fields[1].AsString:=Edit2.Text;
    q.Post;
  finally
   q.Free;
end;

Es exactamente lo que estaba buscando.....me imagino que esta es otra forma de insertar se puede seguir la misma idea para editar, eliminar.
Saludos.....
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 10-02-2010 a las 15:43:43.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Copiar el contenido de un DataSet a otro DataSet Javi2 Varios 82 22-11-2022 09:26:16
¿Trabajar con ClientDataSet sin DataSet asociado? Bauhaus1975 Varios 0 14-11-2008 12:54:22
Copnfigurar ip manualmente soler Varios 25 11-03-2008 21:29:43
error configurando manualmente ADO.net camomilass Conexión con bases de datos 1 10-01-2007 20:10:44
Bloqueo de registros manualmente Will Firebird e Interbase 6 17-06-2005 17:38:38


La franja horaria es GMT +2. Ahora son las 10:54:36.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi