Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con TStringList (https://www.clubdelphi.com/foros/showthread.php?t=67346)

pdimasi2008 12-04-2010 21:51:45

Problemas con TStringList
 
Buenas tardes les quisiera hacer la siguiente consulta,quisiera borrar las filas que el usuario selecciona en un dbgrid; bien creo un objeto , entonces instancio el mismo tantas filas el usuario haya seleccionado, los atributos de dicho objeto son : CodigoM, DescripcionM,RevisionM; asi tambien se llamaran las cabeceras de las columnas de ese dbgrid.
bien ,para esto utilizo un TStringList,instancio los objetos los cargos en la lista,pero..cuando quiero hacer un delete en la base de datos (Access) me tira error.... les paso el codigo:
y muchas gracias!
Código Delphi [-]
var
 sSQL: string;
 Manuales: TManuales;
 i,j,w: integer;
 FabManual:  TManualFactory;
 lista: TStringList;
 Marca: TBookmarkStr;
 MarcaLista: TBookmarkList;
 begin
   Marca:= self.DataSource1.DataSet.Bookmark;
   MarcaLista:= self.DBGridMan.SelectedRows;
   lista:= TStringList.Create;
   try
     for i:= 0 to MarcaLista.Count -1 do
     begin
      for j:= 0 to self.DBGridMan.Columns.Count-1 do
      begin
       lista.AddObject(self.DBGridMan.Fields[j].Text,FabManual.getInstance);
       self.DataSource1.DataSet.Bookmark:= MarcaLista[i]
      end;
    end;
    finally
     self.DataSource1.DataSet.Bookmark:= Marca;
   end;
  for w:= 0 to lista.Count do
  begin
    self.ADODataSet1.Close;
    self.ADODataSet1.Connection:= ADOConnection1;
    ADOConnection1.Open;
    sSQL:= 'delete from MANUALESPRODUCTO ' + ' where PLN_CODIGO = ' + QuotedStr((lista.Objects[w] as TManualFactory).CodigoM)+ 'and PLN_NRO_REV = ' +IntToStr((lista.Objects[w] as TManualFactory).RevisionM)
 'and PLN_DESCRIPCION = ' + QuoTedStr((lista.Objects[w] as TManualFactory).DescripcionM);
   ADOConnection1.Execute(sSQL);
    ADOConnection1.CommitTrans;
   
end;
 end;
les paso la unit donde creo los objetos...
Código Delphi [-]
TManualFactory = class(TObject)
  private
    FCodigoM: string;
    FDescripcionM: string;
    FRevisionM: integer;
    constructor Create;
  public
    class function getInstance: TManualFactory;
    property CodigoM: string read FCodigoM write FCodigoM;
    property DescripcionM: string read FDescripcionM write FDescripcionM;
    property RevisionM: integer read FRevisionM write FRevisionM;
    end;
implementation
var
 ManualFactory: TManualFactory;
 constructor TManualFactory.Create;
 begin
  self.FCodigoM:= '';
  self.FRevisionM:= 0;
  self.FDescripcionM:= '';
 end;
 class function TManualFactory.GetInstance: TManualFactory;
 begin
   Result:= ManualFactory;
 end;
initialization
 ManualFactory:= TManualFactory.Create;
finalization
 ManualFactory.Free;
end.

maeyanes 12-04-2010 22:40:52

Hola...

Así sin que digas que error es el que te "tira", pues está un poco difícil ver donde podría estar tu problema. Ahora, revisando rápidamente tú código, veo que en la creación de la cadena SQL te faltan algunos espacios en blanco:

Código Delphi [-]
sSQL := 'delete from MANUALESPRODUCTO where PLN_CODIGO = ' + QuotedStr((lista.Objects[w] as TManualFactory).CodigoM) + 
  ' and PLN_NRO_REV = ' + IntToStr((lista.Objects[w] as TManualFactory).RevisionM) + 
  ' and PLN_DESCRIPCION = ' + QuoTedStr((lista.Objects[w] as TManualFactory).DescripcionM);


Saludos...

cloayza 12-04-2010 23:05:12

Esta es otra forma de eliminar registros seleccionados en un DBGrid.

Código Delphi [-]
procedure TForm4.BitBtn1Click(Sender: TObject);
Var
     i:Integer;
begin
     with DBGrid1.DataSource.DataSet do
     Begin
          for i:=0 to DBGrid1.SelectedRows.Count-1 do
          begin

           GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i]));

           DBGrid1.DataSource.DataSet.Delete;

          end;
     End;
end;

Espero te ayude...

Saludos

pdimasi2008 14-04-2010 14:52:58

Bueno ya se por donde viene el problema...lastima que no se como solucionarlo todavia.... resulta que me olvide de comentar que cuando el usuario ingresa un codigo a borrar el dbgrid trae los datos de dos tablas (osea se realiza una union de dos tablas una de historico y otra de actual) bien el problema viene por ahy no se bien como hacer esto ya que el usuario puede elejir un registro de la tabla actual y otro de la tabla historico.Trate de hacer lo siguiente pero la verdad no tengo mucha idea...
Código Delphi [-]
sql:='delete from MANUALESPRODUCTO where = ' + QuotedStr((lista.Objects[w] as TManualFactory).CodigoM) join HISTORICOMANUALES where(HISTORICOMANUALES.PLNCODIGO = MANUALESPRODUCTO.PLN_CODIGO)'

Caro 15-04-2010 05:16:53

Hola pdimasi2008, podrías añadir la tabla a la que pertenece cada registro, eso en tu consulta que hace la Union y en tus objetos guardas también la tabla a la que pertenecen:

Código Delphi [-]
//En el primer campo tendrías la tabla a la que pertenece
Select 'NombreTabla1' As Tabla, ...... From Tabla1
UNION
Select 'NombreTabla2' As Tabla, ...... From Tabla2
 
//Para el Delete, recuperas el nombre de la tabla
 
aSql := 'Delete From '+TManualFactory(lista.Objects[w]).NombreTabla+' Where........'

Saluditos


La franja horaria es GMT +2. Ahora son las 16:44:15.

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