Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   procedimiento insert into. (https://www.clubdelphi.com/foros/showthread.php?t=69638)

ingabraham 30-08-2010 19:10:10

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

microbiano 30-08-2010 23:00:23

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;

Caral 30-08-2010 23:24:16

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

Casimiro Notevi 31-08-2010 00:12:45

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 :)

Caral 31-08-2010 00:43:15

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

robacio_ivan 31-08-2010 01:04:17

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.

movorack 31-08-2010 01:18:09

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';

ingabraham 31-08-2010 15:32:33

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.

cloayza 31-08-2010 16:01:04

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.


La franja horaria es GMT +2. Ahora son las 18:04:47.

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