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
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