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.