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 30-08-2010
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
procedimiento insert into.

alguien tiene algun procedimiento para guardar un insert into de cualquiera tabla y cualquier dimension de campos.
ej:
Código Delphi [-]
procedure guardardatos tabla(ptabla, pnrocampos,campo1,campo2...)
begin
insert into ptabla  value(...);
end;
 
 
INSERT INTO <nombre_tabla> 
[(<campo1>[,<campo2>,...])]
values 
(<valor1>,<valor2>,...);
 
]

y si tienen uno para modificar set, mucho mejor
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #2  
Antiguo 30-08-2010
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
que es lo que realmente quieres

que es lo que realmente quieres un ejemplo de como se hace un insert?

algunos lo hacen asi :
Código Delphi [-]
with fmodulo.qry_registra do
   begin
     sql.Add('insert into volantes(usuario,recibe,volante,fecha_oficio)');
     sql.Add('values (:usuario,:recibe,:volante,:fecha_oficio);');
     Parameters.ParamByName('usuario').Value:=Trim(Fprincipal.wusuario);
     Parameters.ParamByName('recibe').Value:=wrecibio;
     Parameters.ParamByName('volante').Value:= woficio;
     Parameters.ParamByName('fecha_oficio').AsDate:= Fregistro.dtp_fecha_oficio.Date;
     try
      ExecSQL;
      application.MessageBox('Registro Almacenado Correctamente','',mb_ok + mb_iconinformation);
      exit;
     except
      on E:EOleException do
        begin
        //showmessage('Problemas con query ['+text+']');
        MessageDlg(Format('Error: %s    Codigo: %d', [E.Message, E.ErrorCode]), mtError, [mbOK], 0);
        exit;
       end; 
     end;
   end;

sin embargo a mi no me funciona lo que a mi me funciona es:
Código Delphi [-]
with fmodulo.qry_registra do
   begin
     
sql.Add('INSERT INTO VOLANTES (');
   Sql.Add(' usuario,');   
   sql.Add(' recibe,');
   sql.Add(' volante,');
   sql.Add(' fecha_oficio');
   sql.Add(' ) values (');
   sql.Add(' '+QuotedStr(Fprincipal.wusuario)+', ');
   sql.Add(' '+QuotedStr(wrecibio)+', ');
   sql.Add(' '+QuotedStr(woficio)+', ');
   sql.Add(' '+QuotedStr(DateToStr(wfechaoficio))+')');     try
      ExecSQL;
      application.MessageBox('Registro Almacenado Correctamente','',mb_ok + mb_iconinformation);
      exit;
     except
      on E:EOleException do
        begin
        //showmessage('Problemas con query ['+text+']');
        MessageDlg(Format('Error: %s    Codigo: %d', [E.Message, E.ErrorCode]), mtError, [mbOK], 0);
        exit;
       end; 
     end;
   end;

Última edición por microbiano fecha: 30-08-2010 a las 23:03:07. Razón: por error en no ponerlo en codigo entendible
Responder Con Cita
  #3  
Antiguo 30-08-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No amigo, lo que quiere es un procedimiento o funcion que sirva para hacer cualquier insert a cualquier tabla y a cualquier cantidad de campos, sin importar nombre o tipo de campo.
Segun entiendo, algo que sirva para todo.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #4  
Antiguo 31-08-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Se podía crear un procedimiento que se le pasara el nombre de la tabla, los campos que vamos a dar valores y los valores de los mismos.
Se recorrería todos los campos de la tabla, si se encuentra uno de los campos pasados entonces se le da el valor también pasado, si no existe ese campo entre los pasados entonces se "pasa de él". Se supone que tendrán un valor por defecto.
En fin, es demasiado genérico, habría que tener muy claro para qué tablas, campos y valores se va a hacer y tenerlo controlado.
Lo que no vale es para todos porque si un campo no puede quedar nulo y no le damos valor... saltará el error
Responder Con Cita
  #5  
Antiguo 31-08-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
De que es factible lo es.
Lo que pasa es que habría que diseñar el procedimiento muy bien y con un conocimiento exacto de las tablas.
Pero si se puede, con paciencia.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #6  
Antiguo 31-08-2010
robacio_ivan robacio_ivan is offline
Miembro
 
Registrado: ago 2010
Ubicación: Rio Cuarto - Cordoba
Posts: 21
Poder: 0
robacio_ivan Va por buen camino
Respuesta

Me parece que hacer un procedimiento de esa categoria no es muy complicado, pero me parece que no tendria sentido porque teniendo el componente IBDataSet los insert, edit o delet se hacen de manera muy sencilla.

De todas formas si queres hacer un procedimiento que sirva para todas las tablas lo que podes hacer es una funcion que le pases en nombre de la tabla y en un arreglo los campos de la misma cosa de que lo unico que tenes que hacer es llenar siempre el arreglo con los campos de la tabla a la cual queres hacer el insert.
Responder Con Cita
  #7  
Antiguo 31-08-2010
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
y si la inserción es muchisimo mas compleja?

Código SQL [-]
INSERT INTO films (code, title) VALUES ('B6717', get_title('B6717'));

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #8  
Antiguo 31-08-2010
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
Por ejemplo he intentado hacerlo, como algo asi.

Código Delphi [-]
 
Procedure TUDBDatos.GuardarEnTabla(Tabla,CadenaCampos:string);
var
  Vsql : string;
begin
   Vsql := 'Insert Into '+ Tabla +'  Values('+ CadenaCampos+')';
   with ibguardar do
   begin
    close;
    SQL.Clear;
    SQL.Add(Vsql);
    ExecSQL;
   end;
   IBTransaction.CommitRetaining;
end;
 
el llamado podria ser.
 
var Str : String;
begin
   Str   :=  ''''+EdNro.TEXT+''''+','+''''+EdCedula.TEXT+''''+','+''''+EdNombre.TEXT+''''+','+''''+EdDir.TEXT+'''  '+','+''''+EdTel.TEXT+''''+','+''''+EdCargo.TEXT+''''+','+''''+DateToStr(FIngreso.date)+''''+','+'''  '+EdSueldo.TEXT+''''+','+''''+EdPorc.TEXT+''''+','+''''+'Activo'+'''' ;
 
 UDBDatos.GuardarEnTabla('EMPLEADOS',Str);
- pero tengo problemas cuando sean fechas tipo date que no se como enviarlas o reales.

-siempre utilizo los qry por que me dan mas facilidad y opciones para realizar mas consultas sql.
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #9  
Antiguo 31-08-2010
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Referente a la pregunta, escribi un pequeno codigo que hace lo que requiere...

Pero como dice Movorack, si es un codigo mas complejo no servira o hay que implementar las restricciones y demas...

Espero te ayude...

Aqui va...
Trabaja en base a 2 vectores de tipo Variant, uno para los campos y otro para los valores, ademas se le debe indicar el nombre de la tabla...

Las funciones habilitadas son:
Select, Insert, Delete, Update;

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TSQLType=(sqSelect, sqInsert, sqDelete, sqUpdate);

  TSQLArray=array of Variant;

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    chkInsert: TRadioButton;
    chkSelect: TRadioButton;
    chkUpdate: TRadioButton;
    chkDelete: TRadioButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    AFields, AValues:TSQLArray;
    function CreateSQL(fTable:string; fFields:TSQLArray; fValues:TSQLArray;fSqlType:TSQLType):string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.CreateSQL(fTable:string; fFields:TSQLArray; fValues:TSQLArray;fSqlType:TSQLType):string;
var
   i:Integer;
   fSql,fVal:string;

   function GetValue():String;
   begin
        case VarType(fValues[i]) of
             varString,
             varDate     : Result:=QuotedStr(fValues[i]);
             varByte,
             varWord,
             varShortInt,
             varSmallint,
             varInteger,
             varLongWord,
             varInt64    : Result:=IntToStr(fValues[i]);
             varSingle,
             varDouble   : Result:=FloatTostr(fValues[i]);
             varBoolean  : if fValues[i] then
                              Result:=QuotedStr('True')
                           else
                              Result:=QuotedStr('False');
        end;
end;
begin
     case (fSqlType) Of
         sqSelect:begin
                       fSql:='';
                       for i := Low(fFields)to High(fFields) do
                       begin
                            fSql:=fSql+fFields[i];
                            if i< High(fFields) then
                               fSql:=fSql+', '
                       end;
                       Result:=Format('SELECT %s FROM %s',[fSql, fTable]);
                  end;
         sqInsert:begin
                       fSql:=''; fVal:='';
                       for i := Low(fFields)to High(fFields) do
                       begin
                            fSql:=fSql+fFields[i];

                            fVal:=fVal+GetValue();

                            if i< High(fFields) then
                            begin
                                 fSql:=fSql+', ';
                                 fVal:=fVal+',';
                            end;
                       end;
                       Result:=Format('INSERT INTO %s (%s) VALUES (%s)',[fTable,fSQL, fVal]);
                  end;
         sqDelete,
         sqUpdate:begin
                       fSql:=''; fVal:='';
                       for i := Low(fFields)to High(fFields) do
                       begin
                            fVal:=GetValue();

                            {Concatena Campo y Valor a asignar...}
                            fSql:=fSql+Format('%s=%s',[fFields[i],fVal]);

                            if i< High(fFields) then
                            begin
                                 if fSqlType=sqUpdate then
                                    fSql:=fSql+', '
                                 else
                                    fSql:=fSql+' AND '
                            end;
                       end;

                       if fSqlType=sqUpdate then
                          Result:=Format('UPDATE %s SET %s;',[fTable,fSQL, fVal])
                       else
                          Result:=Format('DELETE FROM %s WHERE (%s)',[fTable,fSQL, fVal])
                  end;
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     {Dimensiona los vectores}
     SetLength(AFields,6);
     SetLength(AValues,6);

     {Asigna los nombre de los campos...}
     AFields[0]:='Id';
     AFields[1]:='Nombre';
     AFields[2]:='Fecha';
     AFields[3]:='Logico';
     AFields[4]:='Num_Entero';
     AFields[5]:='Num_Real'; 

    {Asigna los valores de cada campo...}
     AValues[0]:=10;
     AValues[1]:='Club Delphi';
     AValues[2]:=Date;
     AValues[3]:=True;
     AValues[4]:=199999;
     AValues[5]:=1000.00;

    {Se llama al procedimiento CreateSQL...}
    {Edit1.Text ->Para ingresar el nombre de la tabla...}
     
     if chkSelect.checked then
        memo1.lines.Text:=CreateSQL(Edit1.Text, AFields, AValues, sqSelect)
     else if chkInsert.Checked then
        memo1.lines.Text:=CreateSQL(Edit1.Text, AFields, AValues, sqInsert)
     else if chkDelete.Checked then
        memo1.lines.Text:=CreateSQL(Edit1.Text, AFields, AValues, sqDelete)
     else if chkUpdate.Checked then
        memo1.lines.Text:=CreateSQL(Edit1.Text, AFields, AValues, sqUpdate)
end;
end.
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
condicionar un procedimiento dentro de otro procedimiento yossi Varios 7 17-05-2010 10:47:14
procedimiento dentro de procedimiento chechu Varios 6 24-11-2005 23:34:48
Insert me cierra otro Insert motrildelphi Conexión con bases de datos 0 05-05-2005 12:20:27
Ayuda, como llamar a un procedimiento desde otro procedimiento? Ariatna Varios 1 01-02-2005 04:05:35
Insert Con Ibx AGAG4 Conexión con bases de datos 8 09-09-2004 20:29:15


La franja horaria es GMT +2. Ahora son las 18:51:42.


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