Delphi - ayuda urgente por favor para modificar rutina

 
Vista:

ayuda urgente por favor para modificar rutina

Publicado por deysi laura (14 intervenciones) el 06/12/2005 21:07:24
hola necesito su ayuda requiero que en lugar de leer la fecha al final del archivo la cual siempre esta en la misma posicion.
ahora quiero que leea la fecha pero esta fecha esta al principio pero no en la misma posición como la anterior.
estoy modificando esta rutina pero no me ha quedado les envio la rutina original de primer caso de les mensiono hogalay alguien me pueda ayudar
atten deysi laura


if pase then begin
ArchivoCM:=OpenDialog1.filename;
Stop:=false;
intentosfecha:=0;
AssignFile(fCM,ArchivoCM);

//PRIMERO OBTENDRA LA FECHA
Reset(fCM);
While (Not Eof(fCM))and(Not Stop) do Begin
Application.ProcessMessages;
readln(fCM,cmLine); //lee la linea

Longitudcadena:=Length(cmLine);
CMFechaF :=Copy(cmLine,19,6);
intentosfecha:=intentosfecha+1;
try
fechainicial:=strtoDate('01'+'/'+Copy(CMFechaF,5,2)+'/'+Copy(CMFechaF,1,4));
break;
except
intentosfecha:=intentosfecha+1;
end;

if intentosfecha >50 then break;
end;
Closefile(fCM);

try
fechainicial:=strtoDate('01'+'/'+Copy(CMFechaF,5,2)+'/'+Copy(CMFechaF,1,4));
except
SendLogMsg('Cuenta Nueva: Error para detectar período de fecha',LML_LOG);
exit;
end;

fechainicial:=IncMonth(fechainicial,-1);
fechainicial:=StartOftheMonth(fechainicial);
fechafinal :=EndOftheMonth(fechainicial);

mesr :=strtoint(FormatDateTime('mm',fechainicial));
cadanio:=FormatDateTime('yy',fechainicial);

if mesr=1 then cad1:='Ene';
if mesr=2 then cad1:='Feb';
if mesr=3 then cad1:='Mar';
if mesr=4 then cad1:='Abr';
if mesr=5 then cad1:='May';
if mesr=6 then cad1:='Jun';
if mesr=7 then cad1:='Jul';
if mesr=8 then cad1:='Ago';
if mesr=9 then cad1:='Sep';
if mesr=10 then cad1:='Oct';
if mesr=11 then cad1:='Nov';
if mesr=12 then cad1:='Dic';

TempArchivoCM:=Pathllams+'CM'+cad1+cadanio+'.dbf';

if FileExists(TempArchivoCM) then
if Not Pregunta('Ya existe!','"Esta cuenta ya fue procesada,',
'desea procesarla nuevamente?"','')
then begin
exit;
end;
SendLogMsg('Cuenta Nueva: Iniciando Decodificación...',LML_LOG);
frmNCuenta:=TfrmNCuenta.Create(self);
frmNCuenta.Showmodal;
frmNCuenta.free;

SendLogMsg('Cuenta Nueva: Fin de Decodificación ('+inttostr(CuentaregistrosCM)+' regs).',LML_LOG);

SendLogMsg('La cuenta de "'+FormatDateTime('mmmm',fechainicial)+' del '+
FormatDateTime('yyyy',fechainicial)+
'" esta lista para Reportar.',LML_LOG);
end;
end;
end;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ayuda urgente por favor para modificar rutina

Publicado por EMILIO (175 intervenciones) el 07/12/2005 00:29:02
Hola yo estoy dispuesto a ayudarte pero vamos por paso, si puedes esplicame esta parte del codigo para poder indicarte.

if pase then begin
ArchivoCM:=OpenDialog1.filename; // No deberia ser if Opendialog.execute then ?

Stop:=false;
intentosfecha:=0;
AssignFile(fCM,ArchivoCM);

//PRIMERO OBTENDRA LA FECHA
Reset(fCM);
While (Not Eof(fCM)) and (Not Stop) do Begin
Application.ProcessMessages;
readln(fCM,cmLine); //lee la linea

Longitudcadena:=Length(cmLine);
CMFechaF :=Copy(cmLine,19,6); {Como sabes que debes empesar a copiar apartir del caracter 19 y copiar 6 caract si no sabes la posicion donde esta la fecha? }
intentosfecha:=intentosfecha+1;
try
fechainicial:=strtoDate('01'+'/'+Copy(CMFechaF,5,2)+'/'+Copy(CMFechaF,1,4));
break; { No creo que sea necesario un Break aqui pues except solo se ejecuta si la rutina falla y levanta un error de lo contrario no, a no ser que quieras salir del while}
except
intentosfecha:=intentosfecha+1;
end;
Segun dedusco de este codigo lo que deseas hacer es asignar la fecha a la variable pero si no lo puedes hacer lo cual levantaria un error incrementas el contador de la fecha para pasar a otra linea, pero esto no evita el error si quieres evitar que el error se levante debes agregar Raise; esto causara una excepcion silenciosa y porsupuesto limpiar la variable para q todo quede en paz.

if intentosfecha >50 then break; end;
Closefile(fCM);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ayuda urgente por favor para modificar rutina

Publicado por deysi laura (14 intervenciones) el 07/12/2005 17:40:23
procedure TfMain.Nuevo1Click(Sender: TObject);
var pase:boolean;
fCM:Textfile;
cmLine:string;
mesr:word;
cad1,cadanio:string;
intentosfecha:byte;
TempArchivoCM:string;
begin
if OpenDialog1.Execute then begin
if Not LicenciaActiva then begin
Advertencia('Licencia.','"Requiere licencia de uso"','','');
exit;
end;

pase:=true;
if ModoCM=1 then begin
//SOLO PARA AVANTEL
pase:=false;
frmFechAva:=TfrmFechAva.Create(self);
if frmFechAva.Showmodal=mrOK then begin
pase:=true;
end;
frmFechAva.free;
end;
//telmex
if pase then begin
ArchivoCM:=OpenDialog1.filename;
Stop:=false;
intentosfecha:=0;
AssignFile(fCM,ArchivoCM);

//PRIMERO OBTENDRA LA FECHA
Reset(fCM);
While (Not Eof(fCM))and(Not Stop) do Begin
Application.ProcessMessages;
readln(fCM,cmLine); //lee la linea

Longitudcadena:=Length(cmLine);

CMFechaF :=Copy(cmLine,19,6); //aqui si puedo deducir la posición porque esta leyendo un archivo en donde la posición de la es igual es por eso que pondo la linea en donde esta la fecha

intentosfecha:=intentosfecha+1;
try
fechainicial:=strtoDate('01'+'/'+Copy(CMFechaF,5,2)+'/'+Copy(CMFechaF,1,4));
break;
except
intentosfecha:=intentosfecha+1;
end;

if intentosfecha >50 then break;
end;
Closefile(fCM);

try
fechainicial:=strtoDate('01'+'/'+Copy(CMFechaF,5,2)+'/'+Copy(CMFechaF,1,4));
except
SendLogMsg('Cuenta Nueva: Error para detectar período de fecha',LML_LOG);
exit;
end;

fechainicial:=IncMonth(fechainicial,-1);
fechainicial:=StartOftheMonth(fechainicial);
fechafinal :=EndOftheMonth(fechainicial);

mesr :=strtoint(FormatDateTime('mm',fechainicial));
cadanio:=FormatDateTime('yy',fechainicial);

if mesr=1 then cad1:='Ene';
if mesr=2 then cad1:='Feb';
if mesr=3 then cad1:='Mar';
if mesr=4 then cad1:='Abr';
if mesr=5 then cad1:='May';
if mesr=6 then cad1:='Jun';
if mesr=7 then cad1:='Jul';
if mesr=8 then cad1:='Ago';
if mesr=9 then cad1:='Sep';
if mesr=10 then cad1:='Oct';
if mesr=11 then cad1:='Nov';
if mesr=12 then cad1:='Dic';

TempArchivoCM:=Pathllams+'CM'+cad1+cadanio+'.dbf';

if FileExists(TempArchivoCM) then
if Not Pregunta('Ya existe!','"Esta cuenta ya fue procesada,',
'desea procesarla nuevamente?"','')
then begin
exit;
end;
SendLogMsg('Cuenta Nueva: Iniciando Decodificación...',LML_LOG);
frmNCuenta:=TfrmNCuenta.Create(self);
frmNCuenta.Showmodal;
frmNCuenta.free;

SendLogMsg('Cuenta Nueva: Fin de Decodificación ('+inttostr(CuentaregistrosCM)+' regs).',LML_LOG);

SendLogMsg('La cuenta de "'+FormatDateTime('mmmm',fechainicial)+' del '+
FormatDateTime('yyyy',fechainicial)+
'" esta lista para Reportar.',LML_LOG);
end;
end;
end;
end.
// pero a hora lo que quiero es leer la fecha del archivo que esta delimitado por
comas la cual no esta en la misma posición.
el archivo esta asi

2,11036407,1,1,5526272313,CD DE MEXICO ZM,3338158522,GUADALAJARA JA,,22/09/2005,15:58,0004:00,3,0,2.14,,,,0,0,0,0,0,0,0,0,0,0
2,11036407,1,1,5552030195,CD DE MEXICO ZM,5979772237,AMECAMECA MX,,04/09/2005,12:45,0001:00,3,0,0.53,,,,0,0,0,0,0,0,0,0,0,0
2,11036407,1,1,5552030195,CD DE MEXICO ZM,5979772237,AMECAMECA MX,,04/09/2005,15:59,0001:00,3,0,0.53,,,,0,0,0,0,0,0,0,0,0,0
2,11036407,1,1,5552030195,CD DE MEXICO ZM,5979772237,AMECAMECA MX,,04/09/2005,16:56,0005:00,3,0,2.67,,,,0,0,0,0,0,0,0,0,0,0

lo que estoy asiendo es tratar de que cada coma la lea como una columna e indicarle la la comlumna en la cual se encuentra la fecha pero es ahi donde tengo problema porque no se como indicar la clumna.
ayudenme por favor.
de antemano gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ayuda urgente por favor para modificar rutina

Publicado por EMILIO (175 intervenciones) el 07/12/2005 19:35:45
Vamos por pasos, no es q y sea de pocas entendederas el q el codigo esta algo complicado de interiorzar.

Pude deducir q todo el codigo esta dentro del evento y por tanto me permiti hacerte algunas correcciones que no son errores pero para qe sea mas legible.

primera:

if FileExists(TempArchivoCM) then
if Not Pregunta('Ya existe!','"Esta cuenta ya fue procesada,',
'desea procesarla nuevamente?"','')
then exit; //Quite el begin porque no era necesario.

Dos:

pase:=true;
if ModoCM=1 then begin
//SOLO PARA AVANTEL
pase:=false; ----> // Esto esta demas porque si ya pusistes la variable en true arriba analiza el codigo para q veas q no tiene logica ponerla en false y luego otra ves en true.
frmFechAva:=TfrmFechAva.Create(self);
if frmFechAva.Showmodal=mrOK then begin
pase:=true; // Esto tamben esta de mas por el mismo motivo ya la pusistes en true antes. Si quieres mantener la condicion para capturar la respuesta de Showmodal una variante es hacerlo asi: if frmFechAva.Showmodal=mrOK then; le agregue un punto y coma al final esto hara q se siga evaluando la condicion pero q no se ejecuta nada despues del then.
end;
frmFechAva.free;
end;
//telmex Avatel y Telmex son la misma cosa o se procesan por separado?. Si es por separado tienes serios probles porque despues de mostar el frmFechAva el codio para telmex se seguira ejecutando. Una solucion para esto es poner a "pase" en false aqui: if frmFechAva.Showmodal=mrOK then pase:=false;

if pase then begin
ArchivoCM:=OpenDialog1.filename;
Stop:=false;
intentosfecha:=0;
AssignFile(fCM,ArchivoCM);

Bueno aqui viene la parte buena jejeje. Mira ahora el proble es q no sabes la pocision de la fecha debido a q la cantidad de comas varian y pierdes la cuenta de las columnas asi q tienes q hacer maniobras para q programa dedusca en q columna esta la fecha, ejemplo: Segun veo solo las fechas teines "/ " asi q por ahi esta la cosa, busca los " / " y encontraras la fecha en la linea q leistes.

Una introduccion:
CMFechaF :=Copy(cmLine,Pos(' /',cmLine)-2,6); // Bueno creo q acabe de decirte como sacar la fecha, y eso q era una introcuccion jajaja. Este codigo va a sacar la fecha de cualquiera de tus archios asi q solo tienes q procesarla de la forma q lo estas haciendo q no revise bien la otra parte delcodigo asi q no puede aconcejarte en nada mas q en esto:

case mesr of
1: cad1:='Ene';
2: cad1:='Feb';
3: .......
end;

La belleza se refleja hasta en la programacion. Mira puedes escribirme a mi correo si lo deseas pues no tengo nada encontra de la amistad.

[email protected] my msn del yahoo
[email protected] my msn del hotmail puedes agregarme si lo deseas.

Byeeeee...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar