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:
Código Delphi
[-]
begin
ListBox1.Clear;
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;
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
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
Código Delphi
[-]
procedure TformListadearranque.magicoClick(Sender: TObject);
var
cont : integer;
begin
empleados := TStringList.Create;
for cont := 0 to ListBox1.Items.Count-1 do
begin
buscar_turnoTemp(ListBox1.Items.Strings[cont],'activo',ComboBox1.Text,encontrado);
if encontrado then
ListBox1.Items.Strings[cont]:=''
else
buscar_aux(ListBox1.Items.Strings[cont],'activo',encontrado);
if encontrado then
ListBox1.Items.Strings[cont]:=''
else
buscar_encasos(ListBox1.Items.Strings[cont],'activo',encontrado);
if encontrado then
ListBox1.Items.Strings[cont]:=''
end;
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;
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.
Código Delphi
[-]
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