Club Delphi  
    FTP   CCD     Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 12-10-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
sitrico Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 14-10-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
sitrico Va por buen camino
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
__________________
Sitrico
Responder Con Cita
Respuesta


Herramientas
Desplegado

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


La franja horaria es GMT +2. Ahora son las 14:12:10.


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