PDA

Ver la Versión Completa : Como crear una sentencia SQL (Insert, update y delete)


sitrico
12-10-2004, 01:00:27
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.


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:


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)


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, 00: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:


If Not (q.Fields[i] is TAutoIncField) then


por


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