Está en la página 1de 11

prodb c:\BBDDProg\prueba sports

pelicula Królowa reina queen netflix

https://www.youtube.com/watch?v=rmzok4PaDRM // 1. Progress 4GL. Presentación del


entorno listo.
el progress consta de varias herramientas tales como:
*appbuider* sirve para crear aplicaciones con ventanas y formularios, viene con una
paleta de todos sus componentes.
*data administration* para la administracion de bbdd, crear bbdd conectar,
desconectar y volcados de bbdd
*data dictrionary* para administrar bbdd y manejos de tablas, creacion de indices,
manejos de campos.
*procedure editor* editor de texto bajo el ABL advance Businnes Lenguaje. se puede
editar procedures, ejecutar comandos.
*progress environment* es una consola de comando para realizar acciones desde la
consola.
*development studio* OJO pendiente

https://www.youtube.com/watch?v=R2MVsD3u0q0 // 2. Progress 4GL. Entorno de


ejecución
con data administration abriremos una nueva base de datos
se crea un directorio desde windows y apuntamos ahi.
pordemos creas desde un modelo vacio, progress tiene en su estructura
progress/openedge/ varias tablas vacias llamadas empty1 al 8.
las diferencias es el tamaño de los buffer de memoria. por lo tanto selccionamos
empty 8 mayor manejo de ¡l buffer de memoria.
en esa carpeta creada deben haber varios archivos pero los mas importantes son 3:
xxx.db, xxx.b1, xxx.d1
despues de crear la bbdd desde el data administration, se debe desconectar(cerrar)
y salir para colocar unos parametros de personalizacion.
son 3 archivos (parametros *xxx.pf*, configuracion*xxx.ini* y un lanzador o
*xxx.bat*) y para ellos creamos una carpeta *run* dentro de la carpeta creada con
la bbdd
# esto son comentarios en Progress.
dentro del archivo de parametro xxx.pf debe ir:
el camino donde esta la bbdd y luego se debe indicar como se va a abrir la bbdd -
1(single) asi:
asi: -db C:\BBDDcurso -1
luego debemos indicar el valor de los bloques del buffer.
asi: -B 1024
luego el numero de limite de registros bloqueados
asi: -L 32768
luego otros parametros como idiomas,
asi:
-cpcoll spanish9 # colletion table: iso8859-1
-cpcase basic # case table. Case insensitive
-cpstream 1252 # stream Code page
-cpinternal 1252 # internal code page
-cplog 1252 # Logs
ahora otro archivo de configuracion xxx.ini
este archivo de configuracion, copias el contenido desde el archivo llamado C:\
progress\OpenEdge\bin\progress.ini

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%

https://www.youtube.com/watch?v=lEgWXag6nl8 // 3. Progress 4GL. Búsquedas con FIND


desde el procedure se escribe FIND tabla. y te da error porque FIND esta creado
para mostrar solo 1 registro.
se resuelve asi: FIND FIRST tabla. va al primer registro.
luego
DISPLAY tabla.campo1 tabla.campo2 etc. muestra en pantalla su contenido que se
pida.
FIND LAST tabla ultimo registro
FIND PREV tabla anterior al reg actual
FIND NEXT tabla para el sgte registro
FIND FIRST tabla where tabla.campoxxx="cadena a buscar"
buscaria el primer registro con la condicion del where
si no lo consigue, da un mensaje de error
FIND FIRST tabla where tabla.campoxxx="cadena a buscar NO-ERROR"
no muestra el error en pantalla.
pero luego cuando pasa a la linea display, entonces es esa linea la que dice: no
hay valor disponible.
otro punto:
si tu haces una busqueda y aparece y luego haces tabla.campo= "xxxxx" ahi estaras
modificando a este valor.
pero si quieres que no haga esa accion, deberas colocar NO-LOCK en el find asi:
FIND FIRST tabla where tabla.campoxxx="cadena a buscar" NO-LOCK NO-ERROR

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

si 2 usuarios abren la tabla con EXCLUSIVE_LOCK, puede pasar que se muerdan la


cola, nunca se consiguen y se tendria que tumbar el servidor
porque, el primero puede mostrar datos y quedarse ahi y el segundo se quedaria
esperando hasta qeu el primero libere.

para evitar este muerde cola, se usa NO-WAIT.


y se debe acompañar con un IF LOCKED para mostrar un mensaje que esta siendo
utilizado y termine asi:
IF LOCKED tabla THEN DO:
MESSAGE "Registro BLoqueado"
RETURN
END

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)

y podemos indicar con que indice debe trabajar asi:


FIND FIRST tabla USE-INDEX nombreindice
este nombreindice se crea desde el appbuilder.

https://www.youtube.com/watch?v=Xk22LWc9UeI // Porqué usar NO-UNDO al declarar


variables
al declarar variables se coloca el parametro de NO-UNDO, esto se puede omitir
y si al hacer cambios decides volver a la situacion anterior omites el NO-UNDO y
para volver al valor inicial deberas usar en el codigo la clausula o parametro
UNDO.

https://www.progress.com/es/openedge/developer // curso de Progress certificado


1. Crear bbdd usando el patron de sport2000 con la aplicacion Data dictionary. se
coloca la ruta y lo ultimo del path seria el nombre de la BBDD ejm: c:\BBDD\ejm y
ejm seria el nombre de la bbdd.
recursos adicionales:
https://docs.progress.com/es-ES/category/openedge-information-hub // manuales e
informacion
https://community.progress.com/s/ // comunidad progress
https://community.progress.com/s/products/openedge // tech support
https://community.progress.com/s/global-search/
%40uri#t=KnowledgeBase&sort=relevancy&f:@commonproductgroup=[OpenEdge] // base de
conocimientos Knowledge
https://www.youtube.com/c/ProgressUserAssistance/playlists // playlist en youtube

user ID: enzodvc


password: Mund0Pr0gr355

https://abldojo.services.progress.com/ // es como jupyter.

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.

/* Declarar un cursor para la tabla que quieres leer */


DEFINE VARIABLE curTabla FOR ttTabla.

/* Abrir el cursor para la tabla */


OPEN QUERY curTabla FOR EACH Tabla.

/* Leer los registros de la tabla y procesarlos */


REPEAT:
/* Obtener los valores de los campos en la tabla */
ASSIGN
ttTabla.FIELD1 = Tabla.Field1
ttTabla.FIELD2 = Tabla.Field2.
/* Puedes realizar operaciones con los valores leídos aquí */

/* Mostrar los valores leídos (esto es solo un ejemplo) */


DISPLAY ttTabla WITH SIDE-LABELS.

/* Avanzar al siguiente registro */


FETCH NEXT curTabla.

/* Salir del bucle cuando no hay más registros */


END.

/* 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.

Notas del libro electronico:


los programas se nombran con .p y son elaboradados en el procedure.
/* DISPLAY "Hola". // esto es un comentario de multiples lineas */

si quieres que aparezca el simbolo de /* */ escribe CMT y luego espacio y aparecera


ese atajo.
FOR EACH Customer:
DISPLAY customer.
END. // te muestra toda una tabla, pero si es muy grande te avisa qeu no cabe en
el marco y no la muestra

FIND [ FIRST | NEXT| PREV | LAST ] record [ WHERE . . .] [ USE-INDEX index-name ]

FIND FIRST Customer.


DISPLAY NAME. // busca el primero
FIND next Customer. // busca el siguiente al primero, necesita ir acompañada de la
sentencia "find first customer"
lo mismo para el ultimo y el penultimo
FIND Last Customer.
find prev Customer.

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

/* pag:2-4 del libro de progress en PDF */


FOR EACH Customer WHERE State = "NH" BY City:
DISPLAY CustNum LABEL "CODCLI" NAME LABEL "Nombre del CLIENTE" City LABEL
"Ciudad" WITH CENTERED.
/*WITH CENTERED: Centra la ventana donde se muestra la data */
/*LABEL para etiquetar el nombre del campo a ver en el resultado*/
FOR EACH Order OF Customer:
/* // en este caso la clausula OF une ambas tablas, Es un JOIN
Aqui busca un cliente que cumpla con la condicion de State=NH y luego muestra
todas las ordenes*/
DISPLAY OrderNum OrderDate ShipDate FORMAT "99/99/9999".
/*FORMAT "99/99/9999" da formato a la fecha*/

END.
END.

DEFINE VARIABLE meses AS CHARACTER INIT "ENERO,FEBrero,MAR".


DISPLAY ENTRY (MONTH(2/20/2023), meses) "CUQUI" "323".
resultado: FEBrero CUQUI 323

DEFINE VARIABLE cMonthList AS CHARACTER NO-UNDO


INIT "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,TR3C3".

FOR EACH Customer WHERE State = "NH" BY City:


DISPLAY CustNum NAME City.
FOR EACH Order OF Customer:
IF ShipDate NE ? THEN

DISPLAY OrderNum LABEL "Order"


OrderDate
ShipDate FORMAT "99/99/99" MONTH(shipdate) WITH CENTERED.
DISPLAY ordernum shipdate ENTRY(MONTH(ShipDate), cMonthList) LABEL "Month".
END.
END.
/* aqui hay varias cosas nuevas
lo otro es que con ENTRY busca un valor, primera posicion y lo sustiyuye por el
valor del vector en su posicion. */
Y lo tercero es que MONTH (extrae el mes de una fecha.)

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

DEFINE VARIABLE meses AS CHARACTER NO-UNDO INITIAL


"1,2,3,4,5,6,700,800,900,octubre,noviembre, diciembre".
DISP NUM-ENTRIES (meses). /* salida: 12*/
DISP INTEGER(ENTRY (7, meses))./*salida: 700 pero en numero, no en character */
DISP LOOKUP("noviembre", meses) /* Lookup sirve para buscar una cadena
("noviembre") en un vector(meses) */

DISPLAY TODAY TIME. // formato de la suma de segundos


DISPLAY STRING(TIME, "HH:MM:SS"). // formato tradicional
DISPLAY FILL("*",5) // repite el string 5 veces // salida: *****
DISPLAY INDEX ("BABACBB","AC"). // te da la posicion del target(AC) en el
origen(BABACBB) en este caso el 4.
DISPLAY LENGTH ("BABACBB") // muestra el tamaño de los caracteres
DISPLAY LEFT-TRIM (" BABACBB"). muestra el string sin espacios en Blanco o TRIM
tambien es valido.
var1= "Hola,ola".
DISP RIGHT-TRIM(var1, "la") WITH FRAME G. /*en este caso remueve al final los
caracteres "la" Salida: Hola,o */

DISPLAY REPLACE ("RRRBABACBB","R", "Z"). // reemplaza la R x la Z // salida:


ZZZBABACBB
DISPLAY SUBSTRING ("RRRBABACBB",7) salida: ACBB
DISPLAY SUBSTR ("ABCDEF", 2,4). salida: BCDE /*SUBSTRING = SUBSTR*/
DISPLAY RANDOM (1,6) // arroja numero aleatorio en ese rango.
DISPLAY ROUND (15.5455,2) // los paramatros son: numero con sus decimales , numero
de decimales.

atajos del teclado para escribir sentecias x ti.


• DVI+space para declarar variables // Define Variable Integer (DVI)
• DVC — CHARACTER
• DVDE — DECIMAL
• DVDT — DATE
• DVH — HANDLE
• DVL — LOGICAL
para poder verlas todas vas al menu del procedure editor options-> editing options
-> Alias Button.
Note that you can also define
new aliases of your own. They are stored in a file called p4gl.als.

para crear y alamcenar los archivos complialdores (.r)


se abre una nueva ventana de procedure editor con F3 y se escribe COMPILE source-
procedure SAVE INTO directory.
ya que se crea un nuevo archivo .r es buena idea guardarlos en una carpeta aparte
ejm: COMPILE C:\BBDD\borrar.p SAVE INTO C:\BBDD\R. // donde borrar.p es el
programa o porcedure como se dice en progress y la carpeta \R es donde se van a
almacenar los archivos compilados xxxx.r
y se ejecuta con F2, como si fueses a correr un programa.
para correr un procedure asi: RUN procedure-name [ (parameters) ].
ejm: RUN c:\BBDD\borrar.p y F2
esto se hace desde una ventana de un procedure editor.
tu puedes o bien correr el programa con la extension xxx.p o bien correr el
compilado con la extension xxx.r
pag 89
Herramienta PRO*TOOL
esta herramienta se consigue desde el procedure editor.
una vez adentro buscas un icono .R
ahi vas a colocar todos los path de tu trabajo, haciendo un *add*
ejm en mi caso C:\BBDD y c:\BBDD\R este ultimo donde estan todos los compilados
despues de eso, para saber si progress busca correctamente haces search y buscas tu
archivo xxx.p y deberia salir un listado con los archivos xxx.p y xxx.r en este
caso son siempre 2 el programa y el compilado.
pag 124
pag 146
pag 154
pag 162
Procedure block scoping
ejm:
DEFINE VARIABLE bari AS CHARACTER NO-UNDO.
bari = "hola". /* This is scoped to the whole external procedure. */
display "antes de ir a procedure: " bari.
RUN procedimiento.
display "despues de ir a procedure: " bari.
PROCEDURE procedimiento:
DISPLAY "dentro de procedure: " bari.
END PROCEDURE. /* en este caso el valor de bari se conserva dentro de la procedure
*/

/*mismo ejemplo con otro alcance*/


DEFINE VARIABLE bari AS CHARACTER NO-UNDO.
bari = "hola". /* This is scoped to the whole external procedure. */
display "antes de ir a procedure: " bari.
RUN procedimiento.
display "despues de ir a procedure: " bari.
PROCEDURE procedimiento:
DEFINE VARIABLE bari AS CHARACTER NO-UNDO.
bari = "chao".
DISPLAY "dentro de procedure: " bari.
END PROCEDURE. /* en este caso el valor de bari cambia dentro de la procedure, pero
afuera conserva su valor inicial */

/*mismo ejemplo con otro alcance con 2 variables*/


DEFINE VARIABLE bari AS CHARACTER NO-UNDO.
bari = "hola". /* This is scoped to the whole external procedure. */
display "antes de ir a procedure: " bari.
RUN procedimiento.
display "despues de ir a procedure: " bari /* "y la otra variable" bari2 */.
PROCEDURE procedimiento:
DEFINE VARIABLE bari AS CHARACTER NO-UNDO.
DEFINE VARIABLE bari2 AS CHARACTER NO-UNDO.
bari = "chao".
bari2 = "chivediamo".
DISPLAY "dentro de procedure: " bari "y la otra variable" bari2 .
END PROCEDURE. /* en este caso el valor de bari2 solo se reconoce dentro del
procedure */

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

pag 168 Looping with a DO block


ejemplo:
DEFINE VARIABLE iCount AS INTEGER NO-UNDO.
DEFINE VARIABLE iTotal AS INTEGER NO-UNDO INIT 2.
DO iCount = 1 TO 5: /*esto es como un for i=1 to 5*/
iTotal = iTotal + iCount.
END.
DISPLAY iTotal.
otro ejemplo:
DEFINE VARIABLE iTotal AS INTEGER NO-UNDO INIT 1.
DO WHILE iTotal < 50:
iTotal = iTotal * 2.
END.
DISPLAY iTotal. /* este es un do while normal, mira que adentro del do se hace
mayor a 50 y ahi cuando vuelve a preguntar, no entra e imprime el valor*/

pag 173 FOR blocks


FOR EACH Customer :
DISPLAY CustNum Name.
END. /*ejemplo de unbloque for sencillo.*/

FOR EACH order BY custnum :


DISPLAY CustNum ordernum.
END. /*este ejemplo lista cada orden con su respectivo comprador ordenado por
numero de cliente*/

Joining tables using multiple FOR phrases


FOR EACH Customer,EACH Order OF Customer:
DISPLAY Customer.Custnum Name OrderNum ./* nota aqui que como custNum esta en las
tablas customer y order, ellas debes estar precedidas por su tabla, para poder
mencionarlas en el codigo y asi especificar a cual de los 2 tablas te refieres*/
END. /* aqui imprime todas las ordenes de cada cliente, usando dos tablas
relacionadas con la clausula OF (Order OF Customer)
ejercicio propio:
FOR EACH Customer :
if custnum=1 then
DISPLAY CustNum Name.
END.

FOR EACH customer, FIRST/EACH Order OF Customer:


DISPLAY OrderNum customer.custnum Name FORMAT "x(10)". /* el FORMAT indica la
cantidad de caracteres que debe truncar para la pantalla.*/
END. /*en este ejemplo usa un join de tablas y busca cada cliente y muestra o bien
todas las ordenes (EACH) o la primera orden de cada cliente (FIRST)*/

FOR EACH order BY custnum BY orderdate :


DISPLAY CustNum ordernum orderdate.
END. /*aqui tiene doble factor de orden primero x numero de cliente y dentro
ordenado por numero de fechadeorden

pag 180 Using the USE-INDEX phrase to force a retrieval order

FOR EACH customer, first Order OF Customer USE-INDEX OrderDate:


DISPLAY OrderNum customer.custnum NAME orderdate.
END. /* USE-INDEX es la forma de usar los indices de progress, para ver los inidces
con data dictionary

pag 181 Using the LEAVE statement to leave a block


LEAVE, hace una busqueda con el comando for each pero solo muestra su primer
evento, luego se sale
ejm:
FOR EACH Customer WHERE State = "NH" WITH FRAME f:
DISPLAY Customer.CustNum Name.
LEAVE. // si usas esta orden, solo mostrara un registro y al quitarlo, muestra
una tabla con varios registros
END. /* END FOR EACH Order */

pag 182 Using block headers to identify blocks


si tienes varios bloques, puedes llamarlos con un nombre terminado con ":" ejm:
BLOQUE1: y terminando el bloque con LEAVE BLOQUE1 asi:

/*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 184 REPEAT blocks


/*en este ejemplo, el crea un marco con los campos de la tabla state tiene 3*, pero
no muestra o carga el campo region, segun la clausula except, desde aqui puedes
añadir registros por la clausula INSERT. Yo como ejercicio añadi el bloque salida:
para que no sea iterativo (clausula REPEAT) sino que se ejecute solo 1 vez, a modo
de chafardear.*/
salida:
REPEAT:
INSERT state except region WITH 2 COLUMNS. /*las 2 columnas es para que el
marco tenga solo 2 columnas, puede tener mas o menos.*/
LEAVE salida.
END.

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.

FOR EACH Customer WHERE Country = "USA":


IF CAN-FIND (FIRST Order OF Customer WHERE OrderDate < 1/1/98)
THEN DISPLAY CustNum Name.
ELSE DISPLAY CustNum "No 1997 Orders" @ Name.
END. /* este codigo lo que hace es buscar ordenes asignadas a clientes customer si
lo consigue display custnum y name pero sino lo ocnsigue entonces display custnum
"No tiene ordenes en 1997" */
/* OJO IMPORTANTE. el CAN-FIND devuelve un true solo si consigue 1 registro es por
eso que se usa FIRST para que localice el primer registro que consiga y ya lo
reporta como true. si retiramos el FIRST osea dejamos el CAN-FIND con el first
omitido, entonces conseguira mas de una orden para varios cliente con fecha 1997 y
al conseguir varios, este devuelve falso.*/

pag 200 Record buffers


DEFINE BUFFER <buffer-name> FOR <table-name>.
ejm: DEFINE BUFFER Customer for Customer. /* en este caso tienes un buffer llamado
Customer para la tabla Customer */
otro ejm: DEFINE BUFFER otrobuffer for Customer /* en este caso tienes otro buffer
llamado otrobuffer para la tabla Customer */

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

FOR EACH customer USE-INDEX NAME.


IF NAME >= "D" THEN
LEAVE.
END.
FIND PREV customer USE-INDEX NAME. .
DISPLAY custnum NAME WITH FRAME f.
FIND NEXT customer USE-INDEX NAME. .
DISPLAY custnum NAME.
/*es este ejemplo se busca a la primera persona con name que empieza con D y luego
hace un registro anterior para ubicar a la ultima con name "C"
salida:
1992 Cycles sport
1121 d y A sporting Good. */

FOR EACH customer USE-INDEX NAME.


IF NAME begins "D" THEN
LEAVE.
END.
DISPLAY custnum NAME WITH FRAME f. /* en este ejemplo se sustituye el *name <=* por
el *begins, hace lo mismo*

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.

pG 228. REPEAT PRESELECT

Si tienes una tabla cuyo indice es el campo id.


y quieres sumar 10 a cada codigo id que pasa si no utilizas el preselect que el id
1 le sumas 10 y sera 11, entonces volveras a sumar 10 cuando llegue al id 11y sera
21 y asi sucesivamente.
con el preselect no pasa esto porque el estudia toda la tabla antes y luego hace
los cambios procedentes, de ahi su nombre preselect.

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

También podría gustarte