Linea de programa

Hola buen día, tengo que sacar el saldo anterior desde una tabla que contiene los campos: sale, ened, eneh, febd, febh... Dicd, dich para esto estoy haciendo este programa pero me sale un error que dice varieble ENE no encontrado en la linea donde esta el for no se si estaré haciendo bien el array. Ojala me puedas apoyar estuve me falta hacer eso para terminar el reporte. Gracias.
close databases
cRescta="d:\pruebas\sicofi\pr_conta\main\rescta08"
IF File(cRescta+".idx")
DELETE FILE cRescta+".idx"
ENDIF
USE (cRescta) EXCLUSIVE alias r1
INDEX ON ccta TO (cRescta) FOR LEN(ALLTRIM(ccta))=8
SELECT 1
GO TOP
cMesAnte="09"
nSaldoAntDebe=0
nSaldoAntHaber=0
nGSLdAntDebe=0
nGSLdAntHaber=0
DO WHILE !EOF()
nSaldoAntDebe=iif(cMesAnte="12",iif(r1->sale>0,sale,0),retsaldo(cMesAnte,"D"))
nSaldoAntHaber=iif(cMes="12",iif(r1->sale<0,r1->sale*-1,0),retsaldo(cMesAnte,"H"))
nGSLdAntDebe=nGSLdAntDebe+nSaldoAntDebe
nGSLdAntHaber=nGSLdAntHaber+nSaldoAntHaber
ENDDO
@02,12 say PADL("Saldo Anterior:",15)+" "+TRANSFORM(nGSLdAntDebe,'###,###,###,###.##')+" "+TRANSFORM(nGSLdAntHaber,'###,###,###,###.##')
FUNCTION retsaldo(cMes,cTipo)
nSaldo=0
IF cTipo="D"
IF sale>=0
nSaldo=sale
ENDIF
ELSE
IF sale<0
nSaldo=-1*sale
ENDIF
ENDIF
FOR ji=1 TO VAL(cMes)
cField=campomes(PADL(ALLTRIM(STR(ji)),2,"0"))
nSaldo=nSaldo + &cField + cTipo           &&Aqui sale el error vaiable ENE no encontrado              
NEXT
RETURN nSaldo
FUNCTION campomes(cMes)
LOCAL ARRAY laArray[12]
laArray[01]="ENE"
laArray[02]="FEB"
laArray[03]="MAR"
laArray[04]="ABR"
laArray[05]="MAY"
laArray[06]="JUN"
laArray[07]="JUL"
laArray[08]="AGO"
laArray[09]="SET"
laArray[10]="OCT"
laArray[11]="NOV"
laArray[12]="DIC"
RETURN (laArray[VAL(cMes)])
close databases

1 respuesta

Respuesta
1
El campo cField debe contener "ENED" reemplaza la sección del FOR con lo siguiente
FOR ji=1 TO VAL(cMes)
cField=campomes(STR(ji)) + cTipo
nSaldo=nSaldo + &cField
NEXT
RETURN nSaldo
Bueno estoy probando el código y sale un error que dice "Nesting Error" en el FOR .
Falta cerrar el FOR con ENDFOR
FOR ji=1 TO VAL(cMes)
cField=campomes(STR(ji))+cTipo
nSaldo=nSaldo+&cField
ENDFOR
RETURN nSaldo
Bueno ya me estanqué un poco en esta linea de código,
Con este código me dice que no hay la variable ENE
FOR ji=1 TO VAL(cMes)
 cField=campomes(STR(ji))
 nSaldo=nSaldo + &cField + cTipo
 NEXT
 RETURN nSaldo
Endfor
Y si coloco cField=campomes(STR(ji))+cTipo el bucle se pierde y tengo que pulsar ESC para cancelar el programa. La idea es que recorra las variables del array y luego retorne el nombre del campo + el saldo.
El LOOP se pierde xq pones RETURN nSaldo antes del ENDFOR
en la instruccion
nSaldo=nSaldo+&cField +cTipo,
lo que estas haciendo es sumar lo que contenga el campo nSaldo mas lo que contenga cField, pero como es una macrosustitucion esta buscando el campo ENE q no existe y ademas le esta sumando lo que contenga el campo cTipo que tiene "D" o "H" ¿?
La instruccion correcta es
FOR ji=1 TO VAL(cMes)
cField=campomes(STR(ji))+cTipo
nSaldo=nSaldo+&cField
ENDFOR
RETURN nSaldo
En este caso esta acumulando en el campo nSaldo la macrosustitución de la variable cFieldque va desde 1 hasta lo que contenga cMes, osea ENED, FEBD MARD...
Lo q sucede es q nSaldo=nSaldo+&cField+cTipo es lo q seria:
nSaldo=nSaldo+ened    Ene=cField d=cTipo
El campo ened es de mi tabla y si la idea es acumular en la variable nSaldo el contenido de cField que va desde 1 hasta lo que contenga cMes en este caso cMes contiene "09" tuviera que almacenar desde 01 hasta 09. Si yo pongo cField=campomes (STR(ji))+cTipo tuviera cField=desde 1 hasta 09D y 09D no hay en la matriz. En la matriz tengo 01,02 etc. Ahora a partir de esta linea es que intento hacer la suma cargando la función retsaldo no se si estará bien esta line el alias R1 es la que contiene los campos ened, eneh, febd, febh, etc...
nSaldoAntDebe=iif(cMesAnte="12",iif(r1->sale>0,sale,0),retsaldo(cMesAnte,"D"))
AHORA SI NO ENTENDÍ NADA,
a ver, lo que deseas en acumular en nSaldo los valores que contienen los campos EneD, FebD, MarD... SetD, el nombre de los campos lo generas con una macrosustitución desde laArray, que contiene los doce meses, más el campo cTipo que contiene "D"o"H" entonces
para evitarte dolores de cabeza, primero define tu arreglo no lo ubiques en una rutina
y tu instrucción queda de esta manera
FOR ji=1 TO VAL(cMes)
cField=laArray[ji]+ctipo
nSaldo=nSaldo + &cField
ENDFOR
RETURN nSaldo
En donde
Ji va desde 1 hasta 9
cField=laArray[ji]+ctipo **cField=laArray[ji] si j1 es(2) => cField="FEB"; si cTipo="D" => cField="FEBD"
nSaldo=nSaldo+&cField ** es equivalente a nSaldo=nSaldo+FEBD
Espero no quitarte tu tiempo, pero a que  te refieres con define tu arreglo no lo ubiques en una rutina, he hecho esto
FOR ji=1 TO VAL(cMes)
cField=laArray[ji]+ctipo   Con esta linea me esta dciendo q va desde 1D hasta 09D y en el array no lo va a encontrar estas variables ya q en el array tengo 01,02,03...12
nSaldo=nSaldo + &cField
ENDFOR
RETURN nSaldo
FUNCTION laArray(cMes)
LOCAL ARRAY laArray1[12]
laArray[01]="ENE"
laArray[02]="FEB"
laArray[03]="MAR"
laArray[04]="ABR"
laArray[05]="MAY"
laArray[06]="JUN"
laArray[07]="JUL"
laArray[08]="AGO"
laArray[09]="SET"
laArray[10]="OCT"
laArray[11]="NOV"
laArray[12]="DIC"
RETURN (laArray[VAL(cMes)])   Aca como retornaria el nombre del mes
Lo que contiene cada elemento de tu arreglo laArray son los nombres que has definido no los números laArray[01] contiene "ENE" y no "01"
Ji actúa como indicador del elemento laArray, lo que haces en tu FUNCIÓN laArray es lo mismo que laArray[ji], por esa razón te digo que laArray lo definas al inicio del programa.
Claro laArray contiene el nombre del mes 01=ENE, 02=FEB, etc en el array busco a través del numero ya sea 01, 02 .. 09 por ejem laArra (ji) vale desde 01 hasta 09 entonces en el array busca 01 q es igual ene, luego busca 02 q es igual a feb ... luego busca 09 q es igual a set, me debe retornar el nombre del mes desde ene a set y luego en esta variable:
nSaldo=nSaldo+&cField+cTipo
Aca me dice q nSaldo=nSaldo+los meses+D  osea nSaldo=nSaldo+ened+ febd +...setd en todo caso como quedaria el programa definiendo laArray al inicio por he corrido el programa y me dice q la variable no existe y apunta el error laArray[01]="ENE"
Quitale LOCAL ARRAY
Bueno ya quite LOCAL ARRAY y me dice que la variable no existe, ¿habrá otra forma de hacer que nSaldo alamacene el contenido de cField?. Gracias.
Utiliza como segunda linea en tu programa
dimension laarray[12]
Luego defines los meses
laArray[01]="ENE"
laArray[02]="FEB"
laArray[03]="MAR"
laArray[04]="ABR"
laArray[05]="MAY"
laArray[06]="JUN"
laArray[07]="JUL"
laArray[08]="AGO"
laArray[09]="SET"
laArray[10]="OCT"
laArray[11]="NOV"
laArray[12]="DIC"
y continuas con el programa
cRescta="d:\pruebas\sicofi\pr_conta\main\rescta08"
.
.
.
.
.
Bueno ya probé de esta manera y me dice Un subíndice que se utilizó está fuera del rango válido. No se que más podría probar.
close databases
DIMENSION laArray[12]
laArray[01]="ENE"
laArray[02]="FEB"
laArray[03]="MAR"
laArray[04]="ABR"
laArray[05]="MAY"
laArray[06]="JUN"
laArray[07]="JUL"
laArray[08]="AGO"
laArray[09]="SET"
laArray[10]="OCT"
laArray[11]="NOV"
laArray[12]="DIC"
cRescta="d:\pruebas\sicofi\pr_conta\main\rescta08"
IF File(cRescta+".idx")
DELETE FILE cRescta+".idx"
ENDIF
USE (cRescta) EXCLUSIVE alias r1
INDEX ON ccta TO (cRescta) FOR LEN(ALLTRIM(ccta))=8
SELECT 1
GO TOP
cMesAnte="09"
nSaldoAntDebe=0
nSaldoAntHaber=0
nGSLdAntDebe=0
nGSLdAntHaber=0
DO WHILE !EOF()
nSaldoAntDebe=iif(cMesAnte="12",iif(r1->sale>0,sale,0),retsaldo(cMesAnte,"D"))
nSaldoAntHaber=iif(cMesAnte="12",iif(r1->sale<0,r1->sale*-1,0),retsaldo(cMesAnte,"H"))
nGSLdAntDebe=nGSLdAntDebe+nSaldoAntDebe
nGSLdAntHaber=nGSLdAntHaber+nSaldoAntHaber
ENDDO
@02,12 say PADL("Saldo Anterior:",15)+" "+TRANSFORM(nGSLdAntDebe,'###,###,###,###.##')+" "+TRANSFORM(nGSLdAntHaber,'###,###,###,###.##')
FUNCTION retsaldo(cMes,cTipo)
nSaldo=0
IF cTipo="D"
IF sale>=0
nSaldo=sale
ENDIF
ELSE
IF sale<0
nSaldo=-1*sale
ENDIF
ENDIF
FOR ji=1 TO VAL(cMes)
cField=laArray (str[ji])
nSaldo=nSaldo + &cField + cTipo
ENDFOR
RETURN nSaldo
TU error sigue en el FOR
1) Ji es numérico y es el indice para seleccionar el array por lo tanto no lo debes convertir a carácter
2) CTipo es una variebale se usa para completar el nombre de la variable en la macrosustitución,
Entonces tu instruccion en el FOR queda asi:
FOR ji=1 TO VAL(cMes)
cField=laArray[ji]+cTipo
nSaldo=nSaldo + &cField
ENDFOR
RETURN nSaldo
Bueno he probado así y me sale los errores descritos más abajo.
FOR ji=1 TO VAL(cMes)
cField=laArray [ji]+cTipo
nSaldo=nSaldo + &cField
ENDFOR
RETURN nSaldo
FUNCTION laArray(cMes)
DIMENSION laArray[12]
laArray[01]="ENE"
laArray[02]="FEB"
laArray[03]="MAR"
laArray[04]="ABR"
laArray[05]="MAY"
laArray[06]="JUN"
laArray[07]="JUL"
laArray[08]="AGO"
laArray[09]="SET"
laArray[10]="OCT"
laArray[11]="NOV"
laArray[12]="DIC"
RETURN (laArray[VAL(cMes)]) Aqui sale error y dice: function argument, value, type or count is invalid y si pulso ignorar apunta a la linea cField=laArray [ji]+cTipo y dice operator/operand type mismatch
En realidad no se porque sale el error, si me envías el programa completo, ya que con la sección que me envías parece que sigues usando la función laArray,
Crea un programa con lo siguiente
DIMENSION laArray[12]
laArray[01]="ENE"
laArray[02]="FEB"
laArray[03]="MAR"
laArray[04]="ABR"
laArray[05]="MAY"
laArray[06]="JUN"
laArray[07]="JUL"
laArray[08]="AGO"
laArray[09]="SET"
laArray[10]="OCT"
laArray[11]="NOV"
laArray[12]="DIC"
cTipo="D"
nField=SPACE(10)
FOR x=1 TO 12
nField=laArray[x]+cTipo
WAIT WINDOW nField
Endfor
Al ejecutarlo el wait muestra el campo que necesitas y no da ningún error
Bueno este es le programa completo, para poder obtener el saldo anterior de acuerdo al rango de meses:
cRescta="d:\pruebas\sicofi\pr_conta\main\rescta08"
IF File(cRescta+".idx")
       DELETE FILE cRescta+".idx"
ENDIF
USE (cRescta) EXCLUSIVE alias r1
             INDEX ON ccta TO (cRescta) FOR LEN(ALLTRIM(ccta))=8
SELECT 1
GO TOP
cMesAnte="09" &&Aqui estoy asumiendo q el mes es setiembre
nSaldoAntDebe=0
nSaldoAntHaber=0
nGSLdAntDebe=0
nGSLdAntHaber=0
DO WHILE !EOF()
nSaldoAntDebe=iif(cMesAnte="12",iif(r1->sale>0,sale,0),retsaldo(cMesAnte,"D"))
nSaldoAntHaber=iif(cMesAnte="12",iif(r1->sale<0,r1->sale*-1,0),retsaldo(cMesAnte,"H"))
nGSLdAntDebe=nGSLdAntDebe+nSaldoAntDebe
nGSLdAntHaber=nGSLdAntHaber+nSaldoAntHaber
ENDDO
@02,12 say PADL("Saldo Anterior:",15)+" "+TRANSFORM(nGSLdAntDebe,'###,###,###,###.##')+" "+TRANSFORM(nGSLdAntHaber,'###,###,###,###.##')
FUNCTION retsaldo(cMes,cTipo)
nSaldo=0
IF cTipo="D"
         IF sale>=0
             nSaldo=sale
         ENDIF
ELSE
        IF sale<0
             nSaldo=-1*sale
        ENDIF
ENDIF
FOR ji=1 TO VAL(cMes)   
   cField=laArray (PADL(ALLTRIM(STR(ji)),2,"0"))
   nSaldo=nSaldo + &cField +cTipo
ENDFOR
RETURN nSaldo
FUNCTION laArray(cMes)
DIMENSION laArray1[12]
laArray1[01]="ENE"
laArray1[02]="FEB"
laArray1[03]="MAR"
laArray1[04]="ABR"
laArray1[05]="MAY"
laArray1[06]="JUN"
laArray1[07]="JUL"
laArray1[08]="AGO"
laArray1[09]="SET"
laArray1[10]="OCT"
laArray1[11]="NOV"
laArray1[12]="DIC"
RETURN (laArray1[val(cMes)])
**** Algunas consideraciones****
nSaldoAntDebe=iif(cMesAnte="12",iif(r1->sale>0,sale,0),retsaldo(cMesAnte,"D")) && Aqui usa la funcion retsaldo para lo q es el "D"=debe no se si estará bien esta linea de codigo
nSaldoAntHaber=iif(cMesAnte="12",iif(r1->sale<0,r1->sale*-1,0),retsaldo(cMesAnte,"H")) && Aqui usa la funcion retsaldo para lo q es el "H"=haber no se si estará bien esta linea de codigo

FOR ji=1 TO VAL(cMes) &&Aqui la variable ji alamacena de 1 a 9 por q convierte cMes a numerico

cField=laArray (PADL(ALLTRIM(STR(ji)),2,"0")) &&Aqui convierte la variable ji a caracter y anteponiendo el cero a la izquierda la variable ji almacena de 01 a 09 para q en el array pueda buscar 01,02...09
He probado usando set step y me di cuenta que si recorre todo el array y al retornar me sale error en esta linea nSaldo=nSaldo + &cField +cTipo y dice la variable ENE o el nombre de los campos no se pudo encontrar.
La tabla rescta08 tiene estos campos: ccta c(10), sale n(15,2), ened n(15,2), eneh(15,2), febd n(15,2), febh (15,2) ...... dicd n(15,2), dich n(15,2).
************ - *********************
Reemplaza tu programa con el que te envío, pruébalo y me avisas si funciono, pero antes realiza una copia de tu programa original
Gracias
DIMENSION laArray1[12]
laArray1[01]="ENE"
laArray1[02]="FEB"
laArray1[03]="MAR"
laArray1[04]="ABR"
laArray1[05]="MAY"
laArray1[06]="JUN"
laArray1[07]="JUL"
laArray1[08]="AGO"
laArray1[09]="SET"
laArray1[10]="OCT"
laArray1[11]="NOV"
laArray1[12]="DIC"
cRescta="d:\pruebas\sicofi\pr_conta\main\rescta08"
cMesAnte="09" &&Aqui estoy asumiendo q el mes es setiembre
nSaldoAntDebe=0
nSaldoAntHaber=0
nGSLdAntDebe=0
nGSLdAntHaber=0
IF File(cRescta+".idx")
DELETE FILE cRescta+".idx"
ENDIF
USE (cRescta) EXCLUSIVE alias r1
INDEX ON ccta TO (cRescta) FOR LEN(ALLTRIM(ccta))=8
SELECT("r1")
GO TOP
SCAN
nSaldoAntDebe=iif(cMesAnte="12",iif(r1->sale>0,sale,0),retsaldo(cMesAnte,"D"))
nSaldoAntHaber=iif(cMesAnte="12",iif(r1->sale<0,r1->sale*-1,0),retsaldo(cMesAnte,"H"))
nGSLdAntDebe=nGSLdAntDebe+nSaldoAntDebe
nGSLdAntHaber=nGSLdAntHaber+nSaldoAntHaber
ENDSCAN
@02,12 say PADL("Saldo Anterior:",15)+" "+TRANSFORM(nGSLdAntDebe,'###,###,###,###.##')+" "+TRANSFORM(nGSLdAntHaber,'###,###,###,###.##')
***********************************************************************************************
FUNCTION retsaldo(cMes,cTipo)
nSaldo=0
IF cTipo="D"
IF sale>=0
nSaldo=sale
ENDIF
ELSE
IF sale<0
nSaldo=-1*sale
ENDIF
ENDIF
FOR ji=1 TO VAL(cMes)
cField=laArray[ji]+cTipo
nSaldo=nSaldo + &cField
ENDFOR
RETURN nSaldo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas