ciclos en tablas
Hola aqui esta lo que tengo hasta ahora.
veran en el proprecedimiento 2 el tipo de datos que manejo; y lo que quiero hacer especificamente es:
por ejemplo para El mes de ENERO es sumar los primeros 3 valores(1,2 y 3 de enero), conocer el valor de esa suma y si no se cumple cierta sentencia entones sumar los valores(2,3 y 4), luego los valores(3,4 y 5) hasta que la suma de esos tres valores sea igual a X cantidad y conocer en que mes y dia se cumple la sentencia.
Saludos
{ PROCEDIMIENTO 1
_________________________________________________________
CREA UN NUEVO ALIAS SOLO SI AÚN NO EXISTE
********************************************************* }
{ Requiere el AliasNombre y AliasDir }
procedure CreacionDeAliasNuevo;
Begin
{ *** Crea un ALIAS, pero solo si aún no existe *** }
If not Session.IsAlias(AliasNombre) then {Si no existe el }
Begin { ALIAS con Var AliasNombre entonces }
CreateDirectory(AliasDir,nil); { Crea el directorio }
try { Agrega un Alias emplenado Driver PARADOX }
Session.AddStandardAlias(AliasNombre,AliasDir,'PARADOX');
Session.SaveConfigFile;
except { Por si existe alguna excepción }
MessageDlg('Error de Creación de Alias',mtError,[mbOk],0);
Exit;
end;
End; {Termina la Creación del Alias }
End;
{ PROCEDIMIENTO 2
_________________________________________________________
CREA UNA TABLA
********************************************************* }
{ Requiere el
NombreTabla,
AliasNombre }
procedure TVentanaPrincipal.CrearTabla(Sender: TObject; TablaX: TTable);
begin
{ *** Inicia Código para la creación de la Tabla *** }
{Screen.Cursor:=crHourGlass; {Instrucción que asigna el tipo
de cursor mientras crea la Tabla}
TablaX:=TTable.Create(Self); {Para inicializar la Tabla por no
haber sido creada en Tiempo de diseño}
try
TablaX.DatabaseName:=AliasNombre;{ Nombre de la base de
datos que actualmente se está utilizando}
TablaX.TableName:=TablaNombre;{ Nombre de la Tabla de base
de datos }
{ Agrega las definiciones para cada campo }
TablaX.FieldDefs.Add('DIA',ftSmallInt,0,True);
TablaX.FieldDefs.Add('ENE',ftFloat,0,False);
TablaX.FieldDefs.Add('FEB',ftFloat,0,False);
TablaX.FieldDefs.Add('MAR',ftFloat,0,False);
TablaX.FieldDefs.Add('ABR',ftFloat,0,False);
TablaX.FieldDefs.Add('MAY',ftFloat,0,False);
TablaX.FieldDefs.Add('JUN',ftFloat,0,False);
TablaX.FieldDefs.Add('JUL',ftFloat,0,False);
TablaX.FieldDefs.Add('AGO',ftFloat,0,False);
TablaX.FieldDefs.Add('SEP',ftFloat,0,False);
TablaX.FieldDefs.Add('OCT',ftFloat,0,False);
TablaX.FieldDefs.Add('NOV',ftFloat,0,False);
TablaX.FieldDefs.Add('DIC',ftFloat,0,False);
{ Agrega una definición de índice para la clave primaria }
TablaX.IndexDefs.Add('','DIA',[ixPrimary]);
{ Todo está configurado, por lo tanto, crea la Tabla }
TablaX.CreateTable;
except { Para alguna excepción }
MessageDlg('Error al crear la Tabla',mtError,[mbOk],0);
Screen.Cursor:=crDefault; { Regresa el tipo de cursor }
TablaX.Free; { Se libera el Objeto TTable }
exit;
end;
{ Todo terminado, esto hace que el usuario lo sepa }
TablaX.Free;
{Screen.Cursor:=crDefault;{Regresa el tipo de Cursor por DEFAULT}
{ MessageDlg('La Tabla se Creó Exitosamente',mtInformation,[mbOk],0);
{ * Finaliza la Creación de la Tabla *
______________________________________________________}
end;
{ PROCEDIMIENTO 3
___________________________________________________________________
RELLENA DATOS A LA TABLA EN FUNCIÓN DE LOS DATOS DE UN ARCHIVO EXCEL
Requiere de 4 parámetros:
1. Sender
2. Fila. Fila desde la cual va iniciar a copiar los datos de Excel
3. Columna. Columna desde la cual empieza
4. HojaNo. El número de Hoja desde la cuál copiará los datos
5. TablaX. Componente fuente de datos que representa toda una tabla de datos.
Proporciona la manera más fácil y rápida de acceder a una tabla }
procedure TVentanaPrincipal.RellenarTabla(Sender: TObject; Fila, Columna:Integer;
HojaNo:Variant; TablaX: TTable);
var
Contador,
AnioBarra : Integer;
ValCelda,
Mensaje,
Titulo,
Otro : String;
begin
TablaX:= TTable.Create(Self); { Cre el componente TablaX de tipo TTable }
TablaX.DatabaseName:=AliasNombre; { Nombre de la base de datos que se está
utilizando actualmente }
TablaX.TableName:=TablaNombre; { Nombre de la Tabla de la base de datos,
en este caso con extensión *.db }
TablaX.Active:=True; { Abrir el conjunto de datos *.db }
TablaX.Edit; { Habilita la edición en el registro actual }
Titulo:=TablaNombre;
Titulo:=StringReplace(Titulo, TipoDat, 'Año',[rfReplaceAll]);
Titulo:= 'Del ' + StringReplace(Titulo, '.db', ' ',[rfReplaceAll]);
Otro := TablaNombre;
Otro := StringReplace(Otro, TipoDat, '',[rfReplaceAll]);
AnioBarra := StrToInt (StringReplace(Otro, '.db', '',[rfReplaceAll])) - AnioInicial;
{*** A continuación empieza el copiado de los datos desde Excel ***}
for Contador:=1 to 31 Do { CicLo para copiar los datos de todos los días del mes }
Begin
try
BarraAvans := Round( ( (Contador + (31 * AnioBarra))/( NoAnios * 31) ) * 100 );
MostrarProgreso.ProgressBar1.Position := BarraAvans;
TablaX.Append; { Crea un registro vacío y lo agrega al final del conjunto de datos }
{ Todos los campos de un registro de la Tabla son rellenados con un ciclo }
TablaX.FieldValues['DIA']:=Contador;
{** ENERO **}
ValCelda := HojaNo.Cells[Fila,Columna];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Enero. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
{ MessageBox(Handle,PChar(Mensaje),PChar(Titulo),MB_ICONEXCLAMATION); }
End;
TablaX.FieldValues['ENE']:=HojaNo.Cells[Fila,Columna];
{** MARZO **}
ValCelda := HojaNo.Cells[Fila,Columna+2];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Marzo. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['MAR']:=HojaNo.Cells[Fila,Columna+2];
{** MAYO **}
ValCelda := HojaNo.Cells[Fila,Columna+4];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Mayo. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['MAY']:=HojaNo.Cells[Fila,Columna+4];
{** JULIO **}
ValCelda := HojaNo.Cells[Fila,Columna+6];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Julio. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['JUL']:=HojaNo.Cells[Fila,Columna+6];
{** AGOSTO **}
ValCelda := HojaNo.Cells[Fila,Columna+7];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Agosto. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['AGO']:=HojaNo.Cells[Fila,Columna+7];
{** OCTUBRE **}
ValCelda := HojaNo.Cells[Fila,Columna+9];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Octubre. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['OCT']:=HojaNo.Cells[Fila,Columna+9];
{** DICIEMBRE **}
ValCelda := HojaNo.Cells[Fila,Columna+11];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Diciembre. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['DIC']:=HojaNo.Cells[Fila,Columna+11];
If Contador < 31 then
Begin
{** ABRIL **}
ValCelda := HojaNo.Cells[Fila,Columna+3];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Abril. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['ABR']:=HojaNo.Cells[Fila,Columna+3];
{** JUNIO **}
ValCelda := HojaNo.Cells[Fila,Columna+5];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Junio. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['JUN']:=HojaNo.Cells[Fila,Columna+5];
{** SEPTIEMBRE **}
ValCelda := HojaNo.Cells[Fila,Columna+8];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Septiembre. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['SEP']:=HojaNo.Cells[Fila,Columna+8];
{** NOVIEMBRE **}
ValCelda := HojaNo.Cells[Fila,Columna+10];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Noviembre. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['NOV']:=HojaNo.Cells[Fila,Columna+10];
End;
If Contador > 30 then
Begin
ValCelda := HojaNo.Cells[Fila + 1 , Columna];
If ValCelda <> '' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 31 datos del mes de Enero, solo se importarán los primeros 31');
ValCelda := HojaNo.Cells[Fila + 1 ,Columna+2];
If ValCelda <> '' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(Titulo+' '
+'Tiene más de 31 datos del mes de Marzo, solo se importarán los primeros 31');
ValCelda := HojaNo.Cells[Fila + 1 ,Columna+4];
If ValCelda <> '' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 31 datos del mes de Mayo, solo se importarán los primeros 31');
ValCelda := HojaNo.Cells[Fila + 1 ,Columna+6];
If ValCelda <> '' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 31 datos del mes de Julio, solo se importarán los primeros 31');
ValCelda := HojaNo.Cells[Fila + 1 ,Columna+7];
If ValCelda <> '' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 31 datos del mes de Agosto, solo se importarán los primeros 31');
ValCelda := HojaNo.Cells[Fila + 1 ,Columna+9];
If ValCelda <> '' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 31 datos del mes de Octubre, solo se importarán los primeros 31');
ValCelda := HojaNo.Cells[Fila + 1 ,Columna+11];
If ValCelda <> '' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 31 datos del mes de Diciembre, solo se importarán los primeros 31');
ValCelda:=HojaNo.Cells[Fila,Columna+3];
If ValCelda<>'' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 30 datos del mes de Abril, solo se importarán los primeros 30');
ValCelda:=HojaNo.Cells[Fila,Columna+5];
If ValCelda<>'' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 30 datos del mes de Junio, solo se importarán los primeros 30');
ValCelda:=HojaNo.Cells[Fila,Columna+8];
If ValCelda<>'' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 30 datos del mes de Septiembre, solo se importarán los primeros 30');
ValCelda:=HojaNo.Cells[Fila,Columna+10];
If ValCelda<>'' then
If ValCelda <> 'NO_D' then
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+'Tiene más de 30 datos del mes de Noviembre, solo se importarán los primeros 30');
End;
{** FEBRERO **}
If Contador <= NDatFeb then
Begin
ValCelda := HojaNo.Cells[Fila,Columna+1];
If ValCelda = '' then
Begin
Mensaje:='No tiene datos de1 ' + IntToStr(Contador) + ' de Febrero. Se tomará como CERO';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
TablaX.FieldValues['FEB']:=HojaNo.Cells[Fila,Columna+1];
End;
If Contador > NDatFeb then
Begin
ValCelda := HojaNo.Cells[Fila,Columna+1];
If ValCelda<>'' then
If ValCelda <> 'NO_D' then
Begin
Mensaje:='Tiene más de ' + IntToStr(NDatFeb) + ' datos del mes de Febrero';
Mensajes.Memo1.Lines.Add(' '+Titulo+' '+Mensaje);
End;
ENd;
except
on EvariantTypeCastError Do
Begin
End;
on EDatabaseError do { En caso de algún error }
Begin
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+' Tipo de Dato no válido del día '+ IntToStr(Contador));
{ MessageBox(Handle,'Tipo de Dato no válido', PChar(Titulo),0); }
TablaX.Cancel; { Cancela cualquier edición hecha en el registro
actual si las ediciones aún no han sido envidas }
TablaX.Edit; { Habilita la edición del registro actual }
exit;
Continue; { Continúe con el ciclo }
End;
on EDBEngineError do { En caso de algún error }
Begin
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+' Error de importación del día '+ IntToStr(Contador));
{ MessageBox(Handle,'Tipo de Dato no válida', PChar(Titulo),0); }
TablaX.Cancel; { Cancela cualquier edición hecha en el registro
actual si las ediciones aún no han sido envidas }
TablaX.Edit; { Habilita la edición del registro actual }
exit;
Continue; { Continúe con el ciclo }
End;
end;
Inc(Fila); { Incrementa FIla para control en Excel }
try
TablaX.Post { Introduce el registro actual en la Base de Datos }
except
on EDBEngineError do { En caso de algún error }
Begin
Mensajes.Memo1.Lines.Add(' '+Titulo+' '
+' Error de importación del día '+ IntToStr(Contador));
{ MessageBox(Handle,'Duplicación de valores', { Duplicate Customer Number } {'Caracteres o Tecla no válida',0); { Key Violation }
TablaX.Cancel; { Cancela cualquier edición hecha en el registro
actual si las ediciones aún no han sido envidas }
TablaX.Edit; { Habilita la edición del registro actual }
Continue; { Continúe con el ciclo }
End;
end;
End;
end;
|