viernes, 29 de marzo de 2019

Paginas Web - Tipos MIME

 Hay dos tipos primarios de MIME son importantes para el rol de tipos por defecto:

  1. text/plain es el valor por defecto para los archivos textuales. Un archivo textual debe ser legible y no puede contener datos binarios.
  2. application/octet-stream es el valor por defecto para todos los demás casos. Un tipo de archivo desconocido debe usar este tipo. Los navegadores tienen un cuidado particular cuando manipulan estos archivos, tratando de proteger al usuario previéndo comportamientos peligrosos.

IANA es el registro oficial de los tipos de media MIME y mantiene una lista oficial de todos los tipos de MIME. Esta tabla, lista algunos de los tipos de MIME importantes para la web:

Extensión Tipo de documento Tipo de MIME
.aac Archivo de audio AAC audio/aac
.abw Documento AbiWord application/x-abiword
.arc Documento de Archivo (múltiples archivos incrustados) application/octet-stream
.avi AVI: Audio Video Intercalado video/x-msvideo
.azw Formato  eBook Amazon Kindle  application/vnd.amazon.ebook
.bin Cualquier tipo de datos binarios application/octet-stream
.bz Archivo BZip application/x-bzip
.bz2 Archivo BZip2 application/x-bzip2
.csh Script C-Shell application/x-csh
.css Hojas de estilo (CSS) text/css
.csv Valores separados por coma (CSV) text/csv
.doc Microsoft Word application/msword
.epub Publicación Electrónica (EPUB) application/epub+zip
.gif Graphics Interchange Format (GIF) image/gif
.htm Hipertexto (HTML) text/html
.html
.ico Formato Icon image/x-icon
.ics Formato iCalendar text/calendar
.jar Archivo Java (JAR) application/java-archive
.jpeg Imágenes JPEG image/jpeg
.jpg
.js JavaScript (ECMAScript) application/javascript
.json Formato JSON application/json
.mid Interfaz Digital de Instrumentos Musicales (MIDI) audio/midi
.midi
.mpeg Video MPEG video/mpeg
.mpkg Paquete de instalación de Apple application/vnd.apple.installer+xml
.odp Documento de presentación de OpenDocument application/vnd.oasis.opendocument.presentation
.ods Hoja de Cálculo OpenDocument application/vnd.oasis.opendocument.spreadsheet
.odt Documento de texto OpenDocument application/vnd.oasis.opendocument.text
.oga Audio OGG audio/ogg
.ogv Video OGG video/ogg
.ogx OGG application/ogg
.pdf Adobe Portable Document Format (PDF) application/pdf
.ppt Microsoft PowerPoint application/vnd.ms-powerpoint
.rar Archivo RAR application/x-rar-compressed
.rtf Formato de Texto Enriquecido (RTF) application/rtf
.sh Script Bourne shell application/x-sh
.svg Gráficos Vectoriales (SVG) image/svg+xml
.swf Small web format (SWF) o Documento Adobe Flash application/x-shockwave-flash
.tar Aerchivo Tape (TAR) application/x-tar
.tif Formato de archivo de imagen etiquetado (TIFF) image/tiff
.tiff
.ttf Fuente TrueType font/ttf
.vsd Microsft Visio application/vnd.visio
.wav Formato de audio de forma de onda (WAV) audio/x-wav
.weba Audio WEBM audio/webm
.webm Video WEBM video/webm
.webp Imágenes WEBP image/webp
.woff Formato de fuente abierta web (WOFF) font/woff
.woff2 Formato de fuente abierta web (WOFF) font/woff2
.xhtml XHTML application/xhtml+xml
.xls Microsoft Excel application/vnd.ms-excel
.xml XML application/xml
.xul XUL application/vnd.mozilla.xul+xml
.zip Archivo ZIP application/zip
.3gp Contenedor de audio/video 3GPP video/3gpp
audio/3gpp if it doesn't contain video
.3g2 Contenedor de audio/video 3GPP2 video/3gpp2
audio/3gpp2 if it doesn't contain video
.7z Archivo 7-zip application/x-7z-compressed

miércoles, 13 de marzo de 2019

iTextSharp - NET. C#

iText es una biblioteca de PDF que le permite CREAR, ADAPTAR, INSPECCIONAR y MANTENER documentos en el Formato de Documento Portátil (PDF), lo que le permite agregar la funcionalidad de PDF a sus proyectos de software con facilidad. Incluso tenemos documentación para ayudarle a obtener la codificación.

Actualmente contamos con dos versiones compatibles: iText 5 e iText 7. Ambas están disponibles bajo AGPL y licencia comercial.


iText 5 es una biblioteca de una solución que es compleja, pero está bien documentada para ayudarlo a crear sus soluciones.

iText 7 es una reescritura completa de iText 5, que le permite elegir su aventura con complementos, todo basado en una estructura de código modular simple, fácil de usar y bien documentada.

Ambas versiones le permiten:
- Genere documentos e informes basados ​​en datos de un archivo XML o una base de datos
- Crea mapas y libros, explotando numerosas funciones interactivas disponibles en PDF
- Agregue marcadores, números de página, marcas de agua y otras características a documentos PDF existentes
- Dividir o concatenar páginas de archivos PDF existentes
- Rellenar formularios interactivos.
- Servir documentos PDF generados o manipulados dinámicamente en un navegador web

iText 7 incluye pdfDebug, la primera herramienta de depuración que le brinda una visión general clara de sus flujos de contenido y estructura de documentos, así como pdfCalligraph, que le permite aprovechar la tipografía avanzada.

iText está disponible para Java, .NET en ambas versiones, y Android y GAE para iText 5 solamente.

iTextSharp es el puerto .NET de iText 5.

martes, 12 de marzo de 2019

Entity Framework - Caracteristicas

Características de Entity Framework


Multiplataforma: EF Core es un marco multiplataforma que puede ejecutarse en Windows, Linux y Mac.

Modelado: EF (Entity Framework) crea un EDM (Entity Data Model) basado en entidades POCO (Plain Old CLR Object) con propiedades get / set de diferentes tipos de datos. Utiliza este modelo al consultar o guardar datos de la entidad en la base de datos subyacente.

Consultas: EF nos permite usar consultas LINQ (C # / VB.NET) para recuperar datos de la base de datos subyacente. El proveedor de la base de datos traducirá estas consultas LINQ al lenguaje de consulta específico de la base de datos (por ejemplo, SQL para una base de datos relacional). EF también nos permite ejecutar consultas de SQL sin procesar directamente en la base de datos.

Seguimiento de cambios: EF realiza un seguimiento de los cambios ocurridos en instancias de sus entidades (valores de propiedad) que deben enviarse a la base de datos.

Guardar: EF ejecuta los comandos INSERT, UPDATE y DELETE en la base de datos en función de los cambios ocurridos en sus entidades cuando llama al método SaveChanges() . EF también proporciona el SaveChangesAsync() asíncrono SaveChangesAsync() .

Concurrencia: EF usa concurrencia optimista de forma predeterminada para proteger los cambios de sobrescritura realizados por otro usuario desde que se obtuvieron los datos de la base de datos.

Transacciones: EF realiza la administración automática de transacciones al consultar o guardar datos. También proporciona opciones para personalizar la gestión de transacciones.

Almacenamiento en caché: EF incluye el primer nivel de almacenamiento en caché fuera de la caja. Por lo tanto, las consultas repetidas devolverán datos del caché en lugar de golpear la base de datos.

Convenciones incorporadas: EF sigue las convenciones sobre el patrón de programación de la configuración e incluye un conjunto de reglas predeterminadas que configuran automáticamente el modelo EF.

Configuraciones: EF nos permite configurar el modelo EF utilizando atributos de anotación de datos o API Fluent para anular las convenciones predeterminadas.

Migraciones: EF proporciona un conjunto de comandos de migración que se pueden ejecutar en la Consola de NuGet Package Manager o la Interfaz de línea de comandos para crear o administrar un esquema de base de datos subyacente.

martes, 26 de febrero de 2019

Progress - comandos útiles

/* RECORRER TABLA*/
/*for each Endeds:
    display Endeds.
end.*/

/*BUSCAR PRIMER REGISTRO*/
/*find first Endeds
     no-lock no-error.*/

/*BUSCAR ULTIMO REGISTRO*/
/*find last Endeds
     no-lock no-error.*/


/*RECORRER TABLA CON CONDICION*/   
/*for each Endeds
    where Endeds.Ended = "1":
   
    display Endeds.Ended
            Endeds.Description.
end.           
*/


/*CREAR REGISTRO*/
/*create Endeds.
assign Endeds.Ended = "50"
       Endeds.Description = "prueba 50".     */


/*BUSCAR UN REGISTRO CONCRETO*/     
/*find Endeds
     where Endeds.ended = "50"
     no-lock no-error.
   
     display Endeds .
*/     


/*ELIMINAR REGISTRO*/   
/*   
find Endeds
     where Endeds.ended = "50"
     no-error.
   
     delete Endeds .
*/


/*ANIDAR TABLAS*/
/*for each TipFamiliy
    where TipFamiliy.tipFamiliy   = 1
    no-lock,
    each Families
    where Families.enterprise = 1 and
          Families.tipFamiliy  =   TipFamiliy.TipFamiliy
    no-lock:
   
    display TipFamiliy.Description
            Families.Description
            Families.Familiy.
   
end.   
*/         


/*CLAUSULAS BREAK BY*/
/*def var xcont as int.

for each TipFamiliy
    no-lock,
    each Families
    where Families.enterprise = 1 and
          Families.tipFamiliy  =   TipFamiliy.TipFamiliy
    no-lock
    break by Families.tipFamiliy:

    if first-of (Families.tipFamiliy) then
    do:
        XCONT = 0.
    end.
   
    XCONT = XCONT + 1.
   
    if LAST-OF (Families.tipFamiliy) then
    do:
        DISPLAY XCONT
                Families.tipFamiliy.
    end.
end.
*/


/*tablas temporales + exportaci¢n a fichero*/
def var xcont as int.

DEFINE TEMP-TABLE TMPJORDI
    FIELD TIPFAMILIA AS INT
    FIELD CONTADOR   AS INT
    INDEX IDX01
          TIPFAMILIA.


FOR EACH TMPJORDI:
    DELETE TMPJORDI.
END.

for each TipFamiliy
    no-lock,
    each Families
    where Families.enterprise = 1 and
          Families.tipFamiliy  =   TipFamiliy.TipFamiliy
    no-lock
    break by Families.tipFamiliy:

    if first-of (Families.tipFamiliy) then
    do:
        XCONT = 0.
    end.

    XCONT = XCONT + 1.

    if LAST-OF (Families.tipFamiliy) then
    do:
        CREATE TMPJORDI.
        ASSIGN TMPJORDI.TIPFAMILIA = FAMILIES.TIPFAMILIY
               TMPJORDI.CONTADOR = XCONT.
    end.
end.

output to "c:\tmp\datosjordi.txt".
FOR EACH TMPJORDI
    NO-LOCK:
    export TMPJORDI.
END.
output close.



&SCOPED-DEFINE TableToExport CatTipoTramiteIsai
output to "c:\tmp\ {&TableToExport}.txt".
FOR EACH {&TableToExport} NO-LOCK:
    EXPORT DELIMITER "|"   {&TableToExport}.
END.
output close.



output to "c:\tmp\CatalogoServicios.txt".
FOR EACH CatalogoServicios
    NO-LOCK:
    EXPORT DELIMITER "|"  CatalogoServicios.
END.
output close.


martes, 19 de febrero de 2019

Excel - Tips de Excel para Analisis de Datos

Tips de Excel

Buscar un Dato dentro de una columna( columna usada como vertor)

=BUSCARV(Reporte2!R110,Reporte1!$AD$11:$AD$620,1,FALSO)


Convertir una cadena con separador en columnas. (Texto en Columnas)

19.1000.1100.113.1131.9.5.1.1.1.13903
 =

|_____||_____||_____||_____||_____||_____||_____||_____||_____|

Quitar Duplicados por columna



Marcar los datos de una columna  con una segunda columna


Buscar un Dato dentro de una columna( columna usada como vertor)

=MATCH(A2,$B$2:$B$114,0)     Vs      =COINCIDIR(A2,$B$2:$B$114,0)

Concatenar columnas

=CONCATENAR(S11,".",T11,".",U11,".",V11,".",W11,".",X11,".",Y11,".",Z11,".",AA11,".",AB11,".",AC11)


Obtener el numero de apariciones de un caracter dentro de una cadena.

=LARGO(AF11)-LARGO(SUSTITUIR(AF11,".",""))



jueves, 14 de febrero de 2019

jQuery - Tips de jQuery

Mantener los selectores simples

Hasta hace poco, recuperar elementos DOM con jQuery era una combinación finamente coreografiada de cadenas de selector de análisis, bucles de JavaScript y API incorporadas como getElementById (), getElementsByTagName () y getElementsByClassName (). Pero ahora, todos los principales navegadores son compatibles con querySelectorAll (), que comprende los selectores de consultas CSS y aporta una importante ganancia de rendimiento.

Sin embargo, aún debe intentar optimizar la forma en que recupera los elementos. Sin mencionar que muchos usuarios todavía usan navegadores antiguos que obligan a jQuery a atravesar el árbol DOM, que es lento.

$('li[data-selected="true"] a')   // Fancy, but slow
$('li.selected a')  // Better
$('#elem')  // Best
Acceder al DOM siempre será la parte más lenta de cada aplicación de JavaScript, por lo que minimizarla es beneficioso. Una de las maneras de hacer esto, es almacenar en caché los resultados que jQuery le proporciona. La variable que elija tendrá un objeto jQuery, al que podrá acceder más adelante en su script.

var buttons = $('#navigation a.button');

// Some prefer prefixing their jQuery variables with $:
var $buttons = $('#navigation a.button');
('a.button:animated');   // Does not use querySelectorAll()
$('a.button').filter(':animated');  // Uses it
Deshabilitar el click derecho

Ya sea porque el cliente te lo solicite o tienes la necesidad de implementarlo, con JavaScript puedes deshabilitar facilmente el click derecho del mouse en una web. En esta pequeña entrada te enseño a hacerlo, simplemente tendrás que añadir la siguiente línea de código en al final de tu código html, antes del cierre de la etiqueta "body" de tu web, dentro de una etiqueta "script" como puedes ver a continuación.

<script type='text/javascript'>
 

document.oncontextmenu = function(){return false}
</script>


   También puedes hacerlo de otra manera si tienes implementada la librería de Jquery en tu web, con el siguiente código:
<script type='text/javascript'>
$(function(){
    $(document).bind("contextmenu",function(e){
        return false;
    });
});
</script>

Progress -Tips

dvc    + espacio         =        DEFINE VARIABLE  AS CHARACTER   NO-UNDO.

dvin   + espacio         =       DEFINE VARIABLE  AS INTEGER     NO-UNDO.

dvl     + espacio         =       DEFINE VARIABLE  AS LOGICAL     NO-UNDO.

MESSAGE 1 "cError". 

MESSAGE "cError" VIEW-AS ALERT-BOX INFO BUTTONS OK.


martes, 12 de febrero de 2019

Progress - Ejecutar Proceso

Un archivo .p

DEFINE INPUT  PARAMETER cvarcuentas    AS CHARACTER NO-UNDO.
DEFINE INPUT  PARAMETER iPer           AS INTEGER    NO-UNDO.
DEFINE INPUT  PARAMETER iYrP           AS INTEGER    NO-UNDO.
DEFINE INPUT  PARAMETER pctagsistema   AS CHARACTER  NO-UNDO.
DEFINE OUTPUT PARAMETER lError         AS LOGICAL INIT FALSE NO-UNDO.     
DEFINE OUTPUT PARAMETER cError         AS CHARACTER INIT "" NO-UNDO.


Llamando un archivo .r resultado, del archivo compilado .p.


RUN pCrea.r ON SERVER hAppsistem (INPUT   "19.1000",       
                                                 INPUT   28,                                           
                                                 INPUT   2019,                                           
                                                 INPUT   pcTagSistema,                                 
                                                 OUTPUT   plReturn,                                     
                                                 OUTPUT   pcReturn) NO-ERROR.                           

lunes, 11 de febrero de 2019

Progress - Using the CAN-FIND function



Using the CAN-FIND function



A menudo es necesario verificar la existencia de un registro sin recuperarlo para mostrarlo o actualizarlo. Por ejemplo, su lógica podría necesitar identificar a cada Cliente que tenga al menos un Pedido, pero es posible que no le importe recuperar ningún Pedido real. Para hacer esto, puede usar una alternativa a la declaración FIND que sea más eficiente porque solo verifica las entradas del índice siempre que sea posible para determinar si existe un registro, sin recurrir al trabajo adicional de recuperar el registro en sí. Esta alternativa es la función incorporada CAN-FIND. CAN-FIND toma un solo parámetro, que puede ser cualquier frase de selección de registro. La función CAN-FIND devuelve TRUE or FALSE dependiendo de si la frase de selección de registro identifica exactamente un registro en la base de datos.




Por ejemplo, imagine que desea identificar a todos los Clientes que hicieron pedidos desde 1997. No necesita recuperar o mostrar los Pedidos, solo necesita saber qué Clientes satisfacen este criterio de selección. El siguiente procedimiento simple logra esto:

FOR EACH Customer NO-LOCK WHERE Customer.Country = "USA":
  IF CAN-FIND(FIRST Order OF Customer WHERE Order.OrderDate < 1/1/98) THEN
    DISPLAY Customer.CustNum Customer.Name.
  ELSE
    DISPLAY Customer.CustNum "No 1997 Orders" @ Customer.Name.
END.


FOR EACH Customer NO-LOCK WHERE Customer.Country = "USA":
  FIND FIRST Order OF Customer NO-LOCK WHERE OrderDate < 1/1/98 NO-ERROR.
  IF AVAILABLE Order THEN
    DISPLAY Customer.CustNum Customer.Name Order.OrderDate.
  ELSE
    DISPLAY "No 1997 Orders" @ Customer.Name.
END.

Este procedimiento utiliza un pequeño truco de pantalla que no has visto antes. Si el cliente tiene pedidos para 1997, el procedimiento muestra el Customer name. De lo contrario, muestra la frase de texto No 1997Orders. Si incluye ese valor literal en la sentencia DISPLAY, se muestra en su propia columna como si fuera un campo o una variable. Para mostrarlo en lugar del campo Name, use el símbolo at-sign (@). La siguiente figura muestra el resultado.


Progress - CREATE BUFFER

CREATE BUFFER

Crea un objeto buffer dinámico.
Sintaxis

CREATE BUFFER handle FOR TABLE { table-name | table-handle | buffer-handle}
  [ BUFFER-NAME buffer-name ]
  [ IN WIDGET-POOL widget-pool-name ]


handle

Una variable de tipo HANDLE que representa el identificador del objeto de búfer.


FOR TABLE table-name|table-handle|buffer-handle


Una expresión de caracteres (table-name) que se evalúa como un nombre de tabla de base de datos único o un nombre de tabla temporal estática, un controlador de tabla temporal (table-handle) o un controlador de objeto de búfer existente (buffer-handle), cada uno de los cuales puede especificar el origen de registro para el que se crea el objeto de búfer.
Si el nombre de la tabla es ambiguo o existe, debe calificar el nombre de la tabla de la base de datos con un nombre de la base de datos o cambiar el nombre de la tabla temporal. De lo contrario, si la tabla de base de datos existe en varias bases de datos conectadas, el AVM crea el búfer en la primera base de datos conectada.

BUFFER-NAME buffer-name

Una expresión de tipo CHARACTER que evalúa, en tiempo de ejecución, el nombre del búfer dinámico que está creando. Esta opción permite que una consulta dinámica tenga múltiples buffers para la misma tabla.
IN WIDGET-POOL widget-pool-name
Una expresión de tipo CHARACTER que evalúa, en tiempo de ejecución, el nombre del grupo de widgets que contiene el búfer dinámico.
Nota: los nombres de grupos de widgets no distinguen entre mayúsculas y minúsculas.


DEFINE VARIABLE ix AS INTEGER NO-UNDO.
DEFINE VARIABLE qh AS HANDLE  NO-UNDO.
DEFINE VARIABLE bh AS HANDLE  NO-UNDO.
DEFINE VARIABLE fh AS HANDLE  NO-UNDO EXTENT 10.

CREATE BUFFER bh FOR TABLE "Customer".
CREATE QUERY qh.

qh:SET-BUFFERS(bh).
qh:QUERY-PREPARE("FOR EACH Customer").
qh:QUERY-OPEN().
qh:GET-FIRST().

DISPLAY bh:NAME.

REPEAT ix = 1 TO 10:
  fh[ix] = bh:BUFFER-FIELD(ix).
  DISPLAY fh[ix]:NAME STRING(fh[ix]:BUFFER-VALUE).
END.

qh:QUERY-CLOSE().
bh:BUFFER-RELEASE().
DELETE OBJECT bh.
DELETE OBJECT qh.

jueves, 31 de enero de 2019

Progress - ¿Qué es ABL?

 ¿Qué es ABL?
Advanced Business Language (ABL) es un lenguaje de programación de procedimientos de alto nivel que ayuda a los desarrolladores
para desarrollar aplicaciones opcionalmente utilizando su propia base de datos relacional integrada y herramienta de programación. Estas
Las aplicaciones son portátiles en todos los sistemas informáticos y permiten el acceso a varias fuentes de datos populares sin necesidad de
Tener que aprender los métodos de acceso a los datos subyacentes. Esto significa que el usuario final de estos productos puede ser
Desconociendo la arquitectura subyacente.
Al combinar un lenguaje de cuarta generación y una base de datos relacional, ABL permite a los desarrolladores de aplicaciones
administre los datos relacionales de manera que modele cómo funciona la empresa. Un programador e incluso usuarios finales.
puede hacer prototipos rápidos utilizando las herramientas integradas y GUI del entorno de desarrollo.

ABL es una herramienta versátil y extraordinariamente poderosa. No solo puedes usarlo para programar aplicaciones, sino que
puede crear muchas de las herramientas que usa para ayudar a crear y admitir esas aplicaciones. La mayor parte del desarrollo.
Las herramientas que utiliza para desarrollar aplicaciones OpenEdge® están escritas en ABL.

Progress

Es una Base de Datos.

Es una colección de información interrelacionada así como un conjunto de programas para tener acceso a dicho datos, usada para las aplicaciones de una organización. El objetivo de una base de datos es proporcionar un entorno que sea conveniente y eficiente para extraer y almacenar información. Algunos de los problemas que se presentan cuando no se utiliza una base de datos son:

 • Redundancia e inconsistencia de los datos: Debido a que los archivos de programas de aplicaciones son creados por diferentes personas a través del tiempo, puede ocurrir que los archivos tengan diferente formato o se encuentren duplicados, de la misma manera puede ocurrir que los programas para acceder a la información se encuentre en más de un sitio.
• Desarrollos de múltiples aplicaciones para la recuperación de la información: Un sistema de información basado en Base de datos pretende desarrollar aplicaciones de uso general para la recuperación de la información, tratando de establecer estándares tanto en las aplicaciones como en la forma de almacenar los datos.
• Proliferación de archivos: Pretende aislar los datos de las aplicaciones para un mejor control de tal manera que no se tenga que modificar la estructura de la Base de datos cuando se desarrolle una nueva aplicación.
• Evitar el acceso simultaneo de los usuarios a la misma información: Control de acceso a la información ara evitar su inconsistencia, permitiendo que solamente un usuario tenga acceso a los datos y colocando candados hasta que estos sean liberados.
• Problemas de seguridad: Implantar las restricciones de seguridad para tener acceso a los datos.
• Problemas de integridad: Colocar restricciones de consistencia de datos.

Sistema de información: Conjunto de elementos interrelacionados que tiene como fin suministrar a los usuarios la información requerida para la toma de decisiones.

Sistema administrador de Base de datos(Data Base Manager System): Es un conjunto de herramientas integrado que proporciona el entorno para un eficiente almacenamiento y recuperación de la información.

Abstracción de los datos Un objetivo importante en un sistema de Base de datos es proporcionar a los usuarios una visión abstracta de los datos; el sistema esconde ciertos detalles de cómo se almacenan y mantiene los datos.

Nivel físico: En este nivel se describe como están los datos realmente almacenados, se describen en detalle las estructuras de datos complejas.

• Nivel conceptual: En este nivel se describe que datos son almacenados realmente y las relaciones que existen entre ellos. Este nivel lo emplean los administradores de la Base de datos ya que ellos deben decidir que información es la que se almacena.
• Nivel de visión: Este nivel es empleado por los usuarios ya que ellos solamente necesitan ver los datos con los que va a trabajar.




Para Conectarse a una base de datos en Progress: 
• Seleccionar desde el menú de File y la opción OPEN, después Database. se busca la base de datos realizada por tí. 
• También para conectar la Tecla F3. 

 Para Desconectarse de una Base de Datos en Progress:
 • En la Aplicación de Data Dictionary. 
• Se selecciona la opción de database 
• Después elegir la opción de Disconnect. 
• También para desconectar la Tecla F8.



El Metaesquema

 • Es un conjunto de tablas relacionadas, la cual nos indica la descripción de la estructura de una base de datos.
• Contiene la definición para describir los componentes de una base de datos, tales como tablas, campos, índices entre otros.
 • También contiene elementos y mensajes de validación.
 • Es el corazón de la base de datos en PROGRESS.
• Al momento de crear una base de datos “EMPTY” , se tiene toda la información básica necesaria para crear el esquema de una aplicación.


Definición de una base de datos

• Nombre de Tablas, Campos e Índices: o Máximo de 32 caracteres de largo. o Debe de comenzar por un carácter alfabético (A-Z, o a-z). 9 Caracteres alfabéticos (A-Z o a-z). 9 Dígitos (0-9). 9 Caracteres especiales($,&,%,-). o Es insensitivo al uso de mayúsculas.

Crear Tabla


  •  Table Name 
  •  Etiqueta 
  •  Descripción 
  •  Nombre para “DUMP”.
  •   TRIGGERS y Atributos de traducción. 
  •  Validación de borrado.
  •   Hidden
  •   Frozen 
  •  String Attrs. 
  •  Data server 
  •  Check CRC 
  •  Overdrable





Broker

Un intermediario es el proceso de base de datos principal que crea una instancia y administra el área de memoria compartida de un multiusuario.
base de datos. Realiza diversas tareas en una base de datos en ejecución. Un broker coordina toda la conexión de la base de datos.
Las solicitudes y los servidores recuperan y almacenan datos en nombre de los clientes. El proceso de intermediación bloquea la base de datos.
para evitar que cualquier otro agente o proceso de un solo usuario lo abra.

Server 
Los servidores son procesos de base de datos que acceden a la base de datos a través de la memoria compartida en nombre de uno o más
clientes remotos El agente los inicia, según sea necesario, para manejar los clientes remotos entrantes. Los servidores ABL son los
servidores, que solo admiten clientes remotos de OpenEdge Advanced Business Language (ABL).




Client
Un proceso de cliente podría ser un cliente ABL u otro tipo de cliente OpenEdge, como un Cliente Abierto. Clientela
acceder a la lógica de negocios de una aplicación solicitando un servicio de una Entidad de Negocios (o Tarea de Negocios)
o Business Workflow). Los clientes pueden consultar, agregar, eliminar o modificar datos en una base de datos. Hay dos tipos de
clientes:

• Remoto (Red): los clientes remotos pueden ser locales o remotos, pero no pueden conectarse a una base de datos
directamente, por lo que debe utilizar un servidor. Los clientes de la red acceden a la base de datos a través de un proceso de servidor que
El agente comienza a través de una conexión de red. La red o cliente remoto no tiene acceso a las redes compartidas.
Memoria, y debe comunicarse con un proceso de servidor.

Nota: OpenEdge RDBMS trata a los clientes SQL como clientes remotos, incluso si residen en la misma máquina
como la base de datos.

• Autoservicio: los clientes de autoservicio residen en la misma máquina que el intermediario, accede directamente a la base de datos
a través de la memoria compartida, realice las funciones del cliente y del servidor en un proceso y ejecute la aplicación
lógica directamente

Background processes
Background processes son procesos de base de datos que se ejecutan en segundo plano. Los procesos mejoran la base de datos.
Desempeño y mantenimiento de la integridad de los datos en caso de falla del sistema o falla de los medios.
Hay cuatro procesos de fondo:
• Before-image Writer (BIW): escribe buffers de BI completos en los archivos de BI en el disco.
• After-image Writer (AIW): escribe buffers AI completos en los archivos AI en el disco.
• Escritor asíncrono de páginas (APW): escribe bloques de bases de datos modificados en el disco.
• Watchdog (PROWDOG): se limpia después de que los clientes de autoservicio terminados incorrectamente y el control remoto
Clientes de servidores perdidos.

AppServers

OpenEdge AppServer es un motor de transacciones basado en estándares que proporciona una base confiable para
Transacciones seguras de alto volumen e independencia de la interfaz de usuario.
Al dividir las aplicaciones y separar la lógica de procesamiento de negocios de la lógica de la interfaz de usuario, puede
Accede a las aplicaciones a través de prácticamente cualquier interfaz. La lógica empresarial centralizada mejora la productividad al
proporcionándole un único punto para gestionar el acceso a los datos y procesos. Dado que la lógica de negocio se ejecuta
por separado de la interfaz de usuario de la aplicación, se puede utilizar una amplia variedad de clientes para ampliar la compatibilidad con
Estrategias agresivas de crecimiento.
Figura 4: OpenEdge AppServer Technology

Algunos beneficios clave de OpenEdge AppServer incluyen:
• Proporciona acceso directo a la misma lógica empresarial desde una amplia variedad de OpenEdge y la industria común
Tecnología, que le ofrece muchas opciones sobre cómo interactúa su aplicación con sus usuarios finales.
• Desconecta la ubicación del hardware físico de su aplicación, lo que proporciona flexibilidad para configurar y
manteniendo su entorno operativo.
• Admite el procesamiento asíncrono para un tiempo de respuesta de la aplicación más rápido.
• Garantiza la confiabilidad al ofrecer balanceo de carga y failover Reduce los requisitos de hardware al proporcionar
administración del Estado.







Función TRIM

Elimina los espacios en blanco iniciales y finales, u otros caracteres especificados, de una expresión CHARACTER o LONGCHAR. El tipo de datos del valor devuelto coincide con el tipo de datos de la expresión pasada a la función.


DISPLAY LENGTH("holaffff") LABEL "Byte Length".


DEFINE VARIABLE  i AS INTEGER NO-UNDO.
DEFINE VARIABLE  cvarcuentas AS CHARACTER NO-UNDO.
cvarcuentas = "19.1000.1200".
IF num-entries(cvarcuentas,".") <> 2 THEN
      DO i = 1 TO NUM-ENTRIES(cvarcuentas):
        display ENTRY(i,cvarcuentas).
      END.
ELSE DO:
      display num-entries(cvarcuentas,".").
END.


Using UNDO, LEAVE on a block


En esta sección, prueba un ejemplo que usa UNDO, LEAVE en un bloque. Para deshacer y dejar el bloque que actualiza la tabla OrderLine

FOR EACH ttOline WHERE ttOline.TransType = "":
    ...
    /* Find corresponding bUpdateOline */
    FIND OrderLine WHERE OrderLine.OrderNum = ttOline.OrderNum AND
      OrderLine.LineNum = ttOline.LineNum EXCLUSIVE-LOCK.
    ...
    BUFFER-COPY bUpdateOline TO OrderLine. /* Save OrderLine changes. */
    RELEASE OrderLine.

    /* Re-find the db record to capture any changes made by a trigger. */
    FIND OrderLine WHERE OrderLine.OrderNum = bUpdateOline.OrderNum AND
      OrderLine.LineNum = bUpdateOline.LineNum NO-LOCK.
    BUFFER-COPY OrderLine TO bUpdateOline.
    IF bUpdateOline.ExtendedPrice >
      (ttOline.ExtendedPrice * 1.2) THEN DO:
      cMessage = "Line " + STRING(OrderLine.LineNum) +
        ": Can't increase price by more than 20%.".
      UNDO, LEAVE.
    END.    ...
  END. /* DO FOR EACH ttOline */

Este podría no ser el comportamiento que desea. Por un lado, es posible que desee que todas las líneas de orden se confirmen juntas o que se deshagan si alguna falla. En otro caso, es posible que desee procesar cada OrderLine como una transacción separada, pero continúe si una de ellas falla. Mira ambos casos.
En el primer caso, desea que todas las actualizaciones de OrderLine tengan éxito o fracasen juntas. Si cualquiera falla su validación, todos se retrotraen.

Para confirmar todos los registros de OrderLine juntos o deshacerlos si falla alguna actualización de un registro:

1. Defina que el alcance de la transacción sea mayor que una única iteración del bloque FOR EACH colocando un nuevo bloque DO TRANSACTION a su alrededor. Luego, agregue una etiqueta para ese nuevo bloque para identificar cuánto deshacer en su declaración UNDO:

  OlineBlock:
  DO TRANSACTION:
    FOR EACH ttOline WHERE ttOline.TransType = "":
2. Change the UNDO statement to undo the entire larger transaction and to leave that outer block as well:
 UNDO OlineBlock, LEAVE OlineBlock.
Remember that the default is to undo and leave the innermost block with the error property, the FOR EACH block.
3. Add another END statement to match the new DO TRANSACTION statement that begins the new block:
      END. /* ELSE DO If we updated the OrderLine */
    END./* DO FOR EACH ttOline */
  END. /* new DO TRANSACTION block */
Note that a block label, such as OlineBlock:, does not require a matching END statement. It is simply an identifier for a place in the code and does not actually start a block of its own.
4. Make a change to the code that restores the original values to the temp-table if there's an error. Because the error might not be on the line that's current when you leave the block, you need to re-read all the OrderLines for the Order and buffer-copy their values back into the update copies of each of the temp-table records, in a FOR EACH loop:
  IF cMessage NE "" THEN DO:
    FOR EACH OrderLine
      WHERE OrderLine.OrderNum = bUpdateOline.OrderNum NO-LOCK:
      FIND bUpdateOline WHERE OrderLine.LineNum = bUpdateOline.LineNum
        AND bUpdateOline.TransType = "U".
      BUFFER-COPY OrderLine TO bUpdateOline.
    END.
    RETURN cMessage.
  END.
Now if you make changes to three OrderLines, and the second of the three is invalid, then all three changes are rolled back because they're all part of one large transaction. You see this reflected in your window.



NUM-ENTRIES function
Devuelve el número de elementos en una lista de cadenas de caracteres como un valor INTEGER
list
Una expresión de caracteres que contiene una lista de cadenas de caracteres separadas con un delimitador de caracteres. La lista puede ser una variable de tipo CHARACTER o LONGCHAR. NUM-ENTRIES devuelve el número de elementos en la lista. Específicamente, NUM-ENTRIES devuelve el número de delimitadores más 1, y devuelve 0 si la lista es igual a la cadena vacía ("").
character
Un delimitador que definas para la lista. El valor predeterminado es una coma (,). Esto permite que las funciones operen en listas separadas por comas. Si utiliza un carácter alfabético, este delimitador distingue entre mayúsculas y minúsculas.
DEFINE VARIABLE ix      AS INTEGER   NO-UNDO.
DEFINE VARIABLE regions AS CHARACTER NO-UNDO
  INITIAL "Northeast,Southest,Midwest,Northwest,Southwest".

REPEAT ix = 1 TO NUM-ENTRIES(regions):
  DISPLAY ENTRY(ix, regions) FORMAT "x(12)".
END.



Declaración de  RETURN
Abandona el procedimiento local o remoto o el bloque de funciones definidas por el usuario, el bloque desencadenante, el bloque desencadenante de la base de datos, el bloque de métodos de una clase, el bloque constructor de clases o el bloque de acceso a la propiedad, y regresa al procedimiento de llamada, función definida por el usuario, Método, constructor, o propiedad accesor. Si no hay una persona que llama, RETURN regresa al Editor de procedimientos u otra herramienta ADE o Progress Developer Studio para OpenEdge que invocó el procedimiento, la función definida por el usuario, el bloque desencadenante, el activador de la base de datos, el método basado en clases, el constructor o el acceso a la propiedad.



DISPLAY statement

Mueve los datos a un búfer de pantalla y muestra los datos en la pantalla u otro destino de salida. El AVM utiliza marcos para mostrar datos. Un cuadro describe cómo se organizan los datos constantes y variables para la visualización y la entrada de datos. Puede dejar que ABL construya marcos predeterminados o puede describir explícitamente los marcos y sus características.


    DISPLAY  cvarcuentas + " => " + ccodpres WITH FRAME a COLUMN 1 ROW 1 1 COLUMN.




&SCOPED-DEFINE preprocessor directive
Define una constante de tiempo de compilación (nombre del preprocesador) no global.

&SCOPED-DEFINE preprocessor-name definition


preprocessor-name
El nombre del preprocesador (constante de tiempo de compilación) que proporciona. Las palabras clave reservadas de ABL están permitidas, pero no pueden usarse en expresiones de preprocesador.
definition
Una cadena de caracteres (o referencias de preprocesador que evalúan a una cadena de caracteres) cuyo contenido el preprocesador sustituye al nombre de preprocesador durante la compilación. Si la definición es más larga que en línea, una tilde (~) al final de una línea indica la continuación a la siguiente línea.

&SCOPED-DEFINE tblCta {&tbCuenta}

Notas
* Debe colocar la directiva & SCOPED-DEFINE al principio de una línea, precedida solo por espacios en blanco, caracteres de tabulación o comentarios (/ * comentario * /). El preprocesador recorta todos los espacios iniciales y finales de la definición.
* La sintaxis de las directivas & GLOBAL-DEFINE y & SCOPED-DEFINE son idénticas, pero estas directivas se utilizan de manera diferente.

DEFINE BUFFER statement

DEFINE BUFFER bffAfc FOR {&tblCta}.

ABL le proporciona un búfer predeterminado para cada tabla o tabla temporal que use en un procedimiento o clase. ABL usa ese búfer para almacenar un registro a la vez de la tabla, ya que los registros se necesitan durante el procedimiento o la clase. Si necesita más de un registro o búfer a la vez para una tabla, puede usar esta declaración para definir búferes alternativos que se crean en el momento de la compilación para usar en uno o más procedimientos, o dentro de una sola clase o jerarquía de clases.






DISPLAY statement

Mueve los datos a un búfer de pantalla y muestra los datos en la pantalla u otro destino de salida. El AVM utiliza marcos para mostrar datos. Un cuadro describe cómo se organizan los datos constantes y variables para la visualización y la entrada de datos. Puede dejar que ABL construya marcos predeterminados o puede describir explícitamente los marcos y sus características.

DEFINE VARIABLE ccodpres AS CHARACTER.
DEFINE VARIABLE lipoa AS INTEGER.
DEFINE VARIABLE cpartida AS CHARACTER.
DEFINE VARIABLE cvarcuentas AS CHARACTER.
DEFINE VARIABLE cMtP AS CHARACTER.
    cvarcuentas = '19.1000.1200.122.1221.20.05.01.1.1.12590'.
    ccodpres    = STRING(ENTRY(1,cvarcuentas,"."),"99") + "." + STRING(ENTRY(6,cvarcuentas,"."),"99") + "." + STRING(ENTRY(7,cvarcuentas,"."),"99") + "." + STRING(ENTRY(8,cvarcuentas,"."),"99") + "." + STRING(ENTRY(9,cvarcuentas,"."),"99") + "." + STRING(ENTRY(10,cvarcuentas,"."),"99").
    lipoa       = INT(ENTRY(11,cvarcuentas,".")).
    cpartida    = ENTRY(5,cvarcuentas,".").
    DISPLAY  cvarcuentas + " => " + ccodpres WITH FRAME a COLUMN 1 ROW 1 1 COLUMN.




&SCOPED-DEFINE preprocessor directive
Define una constante de tiempo de compilación (nombre del preprocesador) no global.

&SCOPED-DEFINE preprocessor-name definition


preprocessor-name
El nombre del preprocesador (constante de tiempo de compilación) que proporciona. Las palabras clave reservadas de ABL están permitidas, pero no pueden usarse en expresiones de preprocesador.
definition
Una cadena de caracteres (o referencias de preprocesador que evalúan a una cadena de caracteres) cuyo contenido el preprocesador sustituye al nombre de preprocesador durante la compilación. Si la definición es más larga que en línea, una tilde (~) al final de una línea indica la continuación a la siguiente línea.

&SCOPED-DEFINE tblCta {&tbCuenta}

Notas
* Debe colocar la directiva & SCOPED-DEFINE al principio de una línea, precedida solo por espacios en blanco, caracteres de tabulación o comentarios (/ * comentario * /). El preprocesador recorta todos los espacios iniciales y finales de la definición.
* La sintaxis de las directivas & GLOBAL-DEFINE y & SCOPED-DEFINE son idénticas, pero estas directivas se utilizan de manera diferente.

DEFINE BUFFER statement

DEFINE BUFFER bffAfc FOR {&tblCta}.

ABL le proporciona un búfer predeterminado para cada tabla o tabla temporal que use en un procedimiento o clase. ABL usa ese búfer para almacenar un registro a la vez de la tabla, ya que los registros se necesitan durante el procedimiento o la clase. Si necesita más de un registro o búfer a la vez para una tabla, puede usar esta declaración para definir búferes alternativos que se crean en el momento de la compilación para usar en uno o más procedimientos, o dentro de una sola clase o jerarquía de clases.





EMPTY-TEMP-TABLE( ) method

Elimina todos los registros de una tabla temporal asociada con un objeto de búfer o de una tabla temporal identificada directamente por un controlador de objeto de tabla temporal.
Cuando se vacía una tabla temporal que se define como UNDO en una transacción, el AVM borra los registros individualmente. Esto es menos eficiente que vaciar la tabla temporal fuera de la transacción, donde el AVM borra todos los registros en la tabla temporal como una unidad.
Tipo de devolución: LÓGICA

EMPTY TEMP-TABLE ttCta.





BUFFER-FIELD( ) method

Devuelve un identificador a un campo particular en el búfer.
Return type: HANDLE
Applies to: Buffer object handle
Syntax

BUFFER-FIELD ( field-number | field-name )

field-number
Una expresión entera que representa el número de secuencia del campo en el búfer.
field-name
A CHARACTER string Expresión que representa el nombre del campo en el búfer.