Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Como crear una sentencia SQL (Insert, update y delete) (https://www.clubdelphi.com/foros/showthread.php?t=15128)

sitrico 12-10-2004 02:00:27

Como crear una sentencia SQL (Insert, update y delete)
 
Es un poco largo pero espero me disculpen.

Estoy tratando de mejorar mi aplicación disminuyendo la cantidad de codigo SQL que uso. Por eso, creé un procedimiento que genera las sentencias SQL necesarias para incluir, modificar y borrar registros.

Código Delphi [-]
Procedure CrearSQLActualizar(IdAcc:Integer;Tabla:String;q,u:TQuery;Where:String);

var
i : Integer;
s : String;

Begin
u.DatabaseName := q.DatabaseName;
u.Sql.Clear;
Case IdAcc Of
   AcInc : Begin
           u.SQL.Add('Insert Into '+Tabla);
           // Agregar la lista de campos
           s := '(';
           For i := 0 to q.FieldCount-1 do
              If Not (q.Fields[i] is TAutoIncField) then
                 s := s + q.Fields[i].FieldName + ', ';
           SetLength(s,Length(s)-2);
           s := s+')';
           u.SQL.Add(s);
           u.SQL.Add('Values');
           // Agregar la lista de parametros
           s := '(';
           For i := 0 to q.FieldCount-1 do
              If Not (q.Fields[i] is TAutoIncField) then
                 s := s + ':'+q.Fields[i].FieldName + ', ';
           SetLength(s,Length(s)-2);
           s := s+')';
           u.SQL.Add(s);
           End;
   AcMod : Begin // Modificar
           u.SQL.Add('Update '+Tabla+' Set');
           s := '';
           For i := 0 to q.FieldCount-1 do
              If Not (q.Fields[i] is TAutoIncField) then
                 s := s + q.Fields[i].FieldName+' = :'+q.Fields[i].FieldName+', ';
           SetLength(s,Length(s)-2);
           u.SQL.Add(s);
           u.SQL.Add(Where);
           End;
   AcBor : Begin // Borrar
           u.SQL.Add('Delete From '+Tabla);
           u.SQL.Add(Where);
           End;
   End;
//u.SQL.SaveToFile('CrearSQLActualizar.sql');
End;

Como pueden ver toma los parametros:

IdAcc: la accion (incluir modificar o borrar
Tabla: El Nombre de la tabla
q: la tabla de "Lectura" (un select) aqui esta el problema
u: la Query para actualizar
Where: el filtro para la actualización

En la mayoria de los casos todo funciono muy bien, me causo un problema (que esperaba) con los campos de autoincremento que solucione con el -If Not (q.Fields[i] is TAutoIncField) then- Pero tengo el problema de los campos "forzados" (no se cual es el nombre exacto) me explico.

En algunas consultas y para poder usar los mismos formularios para diferentes bases de datos, tengo que agregar campos que no están en la base de datos:

Código SQL [-]
q.SQL.Add('Select IdComprob, Fecha, Numero, 0 Control, IdDoc, RIF, Nombre, Descripcion, '+
                 'MontoIVA, MontoTot');
q.SQL.Add('From '+Contribuyente.ArchComp+' '+Where);

En el caso anterior el campo IdComprob es un AutoInc y no causa problemas pero el campo "Control" lo fuerzo (para poder asignar los valores de los TEdit valiendome de una rutina generica y el tag)

Código Delphi [-]
Procedure LeerCamposForm(frm:TForm;q:TQuery;StrVaciar:String);
Var
Tag,i : Integer;
Component:TComponent;
Begin
VaciarCamposForm(frm,q,StrVaciar);
If not q.Active Then
   q.Open;
If q.IsEmpty Then
   Begin
   MessageBoxStr('No se encontraron los datos solicitados ('+Frm.Caption+')','Error');
   Exit;
   End;
For i := 0 to frm.ComponentCount-1 do
   Begin
   Component:= frm.Components[i];
   Tag := Component.Tag;
   If Tag >= 100 Then
      Begin // Campos Generales
      Tag := Tag-100; // Tag-100 = FieldNo
      If Component Is TEdit Then
         TEdit(Component).Text := q.Fields[Tag].AsString
      Else If Component Is TComboBox Then
         TComboBox(Component).ItemIndex := q.Fields[Tag].AsInteger
      Else If Component Is tMaskEdit Then
         TMaskEdit(Component).Text := q.Fields[Tag].AsString
      Else If Component Is TDateEdit Then
         TDateEdit(Component).Date := q.Fields[Tag].AsDateTime
      Else If Component Is TCurrencyEdit Then
         TCurrencyEdit(Component).Value := q.Fields[Tag].AsCurrency;
      End;
   End;
End;

Parece una rutina larga pero en realidad simplifica mucho las cosas.

Ahora bien, como puedo saber si un campo de un TQuery corresponde a un campo real en una base de datos o es un campo "Forzado".

Tal vez pueda agregar un prefijo o algo así al nombre del campo (en el Select), pero acepto cualquier otra idea porque no se que otros efectos pueda tener.

Gracias.

sitrico 14-10-2004 01:02:42

Resolví el problema.

Como lo mencioné todo lo que tuve que hacer fue agregarle el prefijo 'xx' al nombre del campo "forzado" y cambiar las líneas:

Código Delphi [-]
If Not (q.Fields[i] is TAutoIncField) then

por

Código Delphi [-]
If Copy(q.Fields[i].FieldName,1,2) <> 'xx' then // Si empieza por xx no se usa

Por cierto ¿ alguien sabe si los campos "forzados" tienen algn nombre específico ?

Salu2 y Gracias


La franja horaria es GMT +2. Ahora son las 14:39:08.

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