Notas Cursoprogress
Notas Cursoprogress
Notas Cursoprogress
3er archivo el lanzador, el tio pone .bat poruqe si pone cdm el antivirus te da
problemas
@echo off
REM AppBuilder
SET DLC=C:\Progress\OpenEdge
SET PROMSGS=%DLC%\PROMSGS
SET PROCFG=%DLC%\PROGRESS.CFG
SET PATH=%PATH%;%DLC%;%DLC%\BIN
START c:\PROGRESS\OpenEdge\bin\Prowin.exe ^
-pf c:\bbdd\run\xxx.pf ^
-ini c:\bbdd\run\xxx.ini ^
-p _ab.r ^
-Wa ^
-T %TMP%
ahora bien, si queremos modificarlo pero solo yo, que los demas puedan acceder pero
no modificar asi:
FIND FIRST tabla where tabla.campoxxx="cadena a buscar EXCLUSIVE-LOCK NO-ERROR"
para liberar el registro con RELEASE tabla, tambien hace un commit de las
modificaciones, es decir, las graba permanentemente
varias cosas nuevas, tambien puedes usar un message en vez de display, donde
message deja el registro posicionado en la busqueda actual.
y lo otro es que al abrir el appbuilder puedes hacer dentro de options multiple
users y como hostname: localhost
y con FIND CURRENT tabla NO-LOCK NO-ERROR, libera el registro bloqueado pero se
queda posicionado en el registro. (esto es valido si ha logrado entrar en modo
EXCLUSIVE)
https://openai.com/chatgpt
OpenEdge es un entorno de desarrollo y una base de datos relacional utilizado en el
desarrollo de aplicaciones empresariales. La lectura de una tabla en OpenEdge
generalmente se realiza mediante el lenguaje de programación ABL (Advanced Business
Language), que es específico de este entorno.
Aquí hay un ejemplo básico de cómo leer una tabla en OpenEdge usando ABL:
/* Definir un conjunto de resultados para almacenar los registros leídos */
DEFINE TEMP-TABLE ttTabla
FIELD1 AS CHARACTER
FIELD2 AS INTEGER.
/* Cerrar el cursor */
CLOSE curTabla.
En este ejemplo:
DEFINE TEMP-TABLE: Se define una tabla temporal (ttTabla) con los mismos campos que
la tabla que deseas leer.
DEFINE VARIABLE curTabla FOR ttTabla: Se define un cursor para la tabla temporal.
OPEN QUERY curTabla FOR EACH Tabla: Se abre el cursor para la tabla que deseas
leer.
REPEAT: Se inicia un bucle para leer cada registro de la tabla.
FETCH NEXT curTabla: Se obtiene el siguiente registro en el cursor.
CLOSE curTabla: Se cierra el cursor después de leer todos los registros.
Este es un ejemplo básico y puede variar según la estructura y los requisitos
específicos de tu aplicación. Asegúrate de ajustar el código según las necesidades
de tu aplicación y la estructura de tu tabla.
FOR EACH Customer WHERE state="nh" BY city: /*BY es ordenado por el campo*/
DISPLAY CustNum NAME state city. // aqui muestra 4 campos
END.
// definicion de variables
DEFINE VARIABLE var1 AS CHARACTER INIT "HOLA".
DEFINE VARIABLE var2 LIKE var1 INIT " Chao".
DISPLAY "Hola" + " chao" .
// el simbolo + o menos debe ir con espacio en blanco entre ellos, sino da error.
DISPLAY var1 var2 " a ver que tal".
DEFINE VARIABLE var1 AS INTEGER INIT 60.
DEFINE VARIABLE var2 LIKE var1 INIT 75.
/*si usas el parametro iNIT 30 en la declaracion de la variable equivale a
xxx=30*/
DISPLAY var1.
DISPLAY var2.
DISPLAY var2 LABEL "BARY".
// IF Y ELSE
FIND FIRST customer.
DISPLAY custnum.
IF custnum NE 1 THEN
DISPLAY "hola".
ELSE
DISPLAY "FalSo"
/*NE Not Equal */
END.
END.
otro ejemplo:
DEFINE VARIABLE ix AS INTEGER NO-UNDO.
DEFINE VARIABLE meses AS CHARACTER NO-UNDO INITIAL "enero,febrero,marzo, abril,
Mayo, junio, julio, agosto,septiembre, octubre, noviembre, diciembre".
REPEAT ix = 1 TO NUM-ENTRIES (meses): /*aqui num-entries cuenta los elementos del
vector, es este caso 12. */
DISPLAY ENTRY (ix, meses) FORMAT "x(12)" . /*entry busca el nª elemento en el
vector y lo muestra ejm enero o febrero etc. */
END.
DISPL NUM-ENTRIES (meses) " hola " ENTRY (ix - 1,meses) . /*Interesante: aqui
el valor de ix despues de salir del bucle es 13 x lo tanta para mostrar el mes 12
osea diciembre, debes hacer codigo ix - 1 */
pag 165
bloque sencillo:
DO:
End. /* se usa cuando se quiere englobar todo en una seccion, si tienes un if con
varias acciones, debes colocar todo en un do end.
ejemplo
DEFINE VARIABLE bari AS INTEGER INIT 5.
IF bari>10 THEN
bari = bari + 5.
ELSE
DO:
bari = bari * bari.
bari=bari + 100.
DISPLAY "impresion dentro de un *DO* dentro de *IF/ELSE*".
END.
DISPLAY bari. /* esta linea esta fuera del if else
/*este ejemplo muestra que necesitas el DO/END para hacer mas de una
sentnecia*/
/*si bari <10 hace varias cosas definidas por el DO/ END */
/*BLOQUE1*/
FOR EACH Customer WHERE State = "NH" WITH FRAME f:
DISPLAY Customer.CustNum NAME.
BLOQUE1:
FOR EACH Order OF Customer BY OrderDate:
DISPLAY OrderNum OrderDate WITH FRAME f.
LEAVE BLOQUE1. /*este ejemplo muestra que depende donde pongas el BLOQUE1 (al
comenzo del 1er. FOR o al comienzo del 2do FOR tiene un alcance diferente.)
END. /* END FOR EACH Order */
END. /* END FOR EACH Customer */
pag 194
FOR EACH Customer WHERE Country = "USA":
DISPLAY custnum "sustituye" @ NAME. /*El @ lo que hace es sustituir el campo NAME
x la cadena "sustituye" */
END.
pag 214
REPEAT:
FIND NEXT customer USE-INDEX NAME.
IF NAME < "C" THEN
NEXT.
ELSE
LEAVE.
END.
DISP custnum NAME. /* en este ejemplo se imprime la primera persona que su nombre
empiece x C*/
pag 224. hay unas lineas que yo creo que deben ir en el archivo h-OrderCalcs.p
si da error mas adelante, es que faltan esas lineas.
Assign: este statement es asignar un valor a una variable, es x=5 o assign x=5, da
igual, pero se usa cuando se asignan valores en varias lineas. A nivel de
temporales y rendimiento si hay diferencia.
Remember also that the REPEAT block does not automatically iterate for you, even if
you
preselect the records. You have to use a FIND statement to move from record to
record.
pag 242