PDA

Ver la Versión Completa : Ayuda con TStringList


alej.villa
01-03-2012, 17:19:54
Buenos días comunidad

de nuevo recorro a ustedes para buscar una solución, este es el problema:

en un ListBox tengo todas las cédulas asignadas según el turno correspondiente que realizó en una consulta SQL en el evento OnShow del formulario, éste es el código:


begin
ListBox1.Clear;
//asigno al ComboBox el turno de manera automática dependiendo de la hora del día
if ((Time >= StrToTime('07:30:00 a.m.')) and (time <= StrToTime('03:29:59 p.m.'))) or
((Time >= StrToTime('07:30:00')) and (time <= StrToTime('15:29:59'))) then
ComboBox1.Text:= 'NOCTURNO';
if ((Time >= StrToTime('03:30:00 p.m.')) and (time <= StrToTime('10:29:59 p.m.'))) or
((Time >= StrToTime('15:30:00')) and (time <= StrToTime('22:29:59'))) then
ComboBox1.Text:= 'MEGATURNO';
if ((Time >= StrToTime('10:30:00 p.m.')) and (time <= StrToTime('07:29:50 a.m.'))) or
((Time >= StrToTime('22:30:00')) and (time <= StrToTime('07:29:59'))) then
ComboBox1.Text:= 'DIURNO';
habilitar;
// Realizo la consulta SQL y filtro el campo cedula de las dos tablas según el turno de trabajo
dm.Query.Close;
dm.Query.SQL.Clear;
dm.Query.SQL.Add('SELECT cedula FROM empleados WHERE turno = :xfiltro and cargo = :cargo');
dm.Query.SQL.Add('UNION ALL');
dm.Query.SQL.Add('SELECT cedula FROM Turno_Temporal WHERE turno_temp = :yfiltro AND estado = :type');
DM.Query.Parameters.ParamByName('xfiltro').DataType:=ftString;
dm.Query.Parameters.ParamByName('xfiltro').Value:=ComboBox1.Text;
dm.Query.Parameters.ParamByName('cargo').DataType:=ftString;
dm.Query.Parameters.ParamByName('cargo').Value:='OPERARIO';
DM.Query.Parameters.ParamByName('yfiltro').DataType:=ftString;
dm.Query.Parameters.ParamByName('yfiltro').Value:=ComboBox1.Text;
DM.Query.Parameters.ParamByName('type').DataType:=ftString;
dm.Query.Parameters.ParamByName('type').Value:='activo';
dm.Query.Open;
while not dm.Query.Eof do
Begin
// Agrego todas las cedulas filtradas en el ListBox
ListBox1.Items.Add(dm.Query.fieldbyname('cedula').AsString);
dm.Query.Next;
end;
magico.Click;
end;


Veran que al finalizar el procedimiento ejecuto otro procedimiento que me separa las cédulas disponibles de las que no lo estan, las cédulas disponibles son agregadas en el objeto TStringList este el código del botón magico


procedure TformListadearranque.magicoClick(Sender: TObject);
var
cont : integer;
begin
//aqui creo la variable
empleados := TStringList.Create;
// aqui recorro el ListBox para separar las cédulas disponibles de las que no lo estan, si las cédulas no estan disponibles
// las borro de esa posición
for cont := 0 to ListBox1.Items.Count-1 do
begin

//procedimiento para saber si un empleado se cambio de turno de trabajo
// si es encontrado significa que si se cambio y se borra del ListBox
// en caso contrario pasa a otro procedimiento

buscar_turnoTemp(ListBox1.Items.Strings[cont],'activo',ComboBox1.Text,encontrado);
if encontrado then
ListBox1.Items.Strings[cont]:=''
else

// procedimiento para saber si el empleado se cambio de cargo de trabajo de modo temporal
// si es encontrado es borrado del ListBox en caso contrario pasa a otro procedimiento

buscar_aux(ListBox1.Items.Strings[cont],'activo',encontrado);
if encontrado then
ListBox1.Items.Strings[cont]:=''
else

// Procedimiento para verificar si el empleado va a ausentarse ese día en el trabajo
// si es encontrado es borrado del ListBox

buscar_encasos(ListBox1.Items.Strings[cont],'activo',encontrado);
if encontrado then
ListBox1.Items.Strings[cont]:=''
end;

// Hasta aquí recorre todas las posiciones asignadas en la consulta y me separa las cédulas disponibles de las que no lo
// estan, (Funciona sin problemas)

// Aqui vuelvo a recorrer el ListBox para separar los campos vacios de los que no lo estan
// y agregar las cedulas en el objeto TStringList anteriormente llamado "empleados"

for cont := 0 to ListBox1.Items.Count-1 do
begin
if ListBox1.Items.Strings[cont] <> '' then
empleados.Add(ListBox1.Items.Strings[cont]);
end;
Label3.Font.Color := clGreen;
Label3.Caption := 'Cantidad de Operarios disponibles '+ IntToStr(empleados.Count);
end;

// hasta aquí todo de maravilla, no da ningún error


El procedimiento que se encuentra en este botón lo uso para registrar lo necesario en la Base de Datos, cabe destacar que este procedimiento funciona, el problema esta cuando trato en insertar en la Base de Datos, ya hice la prueba que solo me muestre un mensaje del dato que lleva el TStringList y lo muestra, pero cuando quiero agregar ese dato en la Base de Datos sale un error "Acces violation at address 00404514 in modulo 'application.exename' Write of Address 00000000" de verdad no se porque sale eso, no se si estoy usando la variable como no es. si pudieran inducirme por el buen camino a solventarlo les agradezco.


procedure TformListadearranque.Button2Click(Sender: TObject);
var
x, j, i:integer;
begin
for x:=0 to CheckListBox1.Items.Count-1 do
try
if CheckListBox1.Checked[x]=true then
begin
buscar_Linea_tempo(CheckListBox1.Items.Strings[x],encontrado);
if not encontrado then
Begin
i:=Sumar(StrToInt(txtCodigo.Text),CheckListBox1.Items.Strings[x]);
begin
j:=0;
while j <= i-1 do
begin
Application.ProcessMessages;
arreglopos[j]:=Posiciones(txtCodigo.Text,CheckListBox1.Items.Strings[x]);
if empleados.Strings[j] <> '' then
begin
with dm.Temporal do
begin
insert;
FieldByName('cedula').AsString:=empleados.Strings[j];
FieldByName('codigo_linea').AsString:=CheckListBox1.Items.Strings[x];
FieldByName('posicion').AsString:=arreglopos[j];
FieldByName('grupo').AsString:=ComboBox1.Text;
FieldByName('fecha').AsDateTime:=Now;
Post;
buscar_cedula(empleados.Strings[j],encontrado);
if encontrado then
begin
Edit;
FieldByName('nombres').AsString:=dm.qLista.fieldbyname('nombres').AsString;
FieldByName('sexo').AsString:=dm.qLista.fieldbyname('sexo').AsString;
Post;
end;
Close;
Open;
end;
end
else
Inc(i);
Inc(j);
end;
end;
end;
end;
except
ShowMessage('error');
end;
end;


PD: uso Delphi 7 y MS SQL Server 2005

ElDioni
01-03-2012, 18:24:52
Hola,

¿has probado a ejecutar tu código paso a paso en la parte de guardar que es la que te falla?, para saber si falla en cuanto haces el insert, si es al hacer el post, al asignar los datos a los campos de la tabla, etc. Así tendríamos el problema más localizado y no se darían palos de ciego.

Saludos.