/* 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, 26 de febrero de 2019
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)
=
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.
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.
También puedes hacerlo de otra manera si tienes implementada la librería de Jquery en tu web, con el siguiente código:
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 derechoYa 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.
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.
RUN pCrea.r ON SERVER hAppsistem (INPUT "19.1000",
INPUT 28,
INPUT 2019,
INPUT pcTagSistema,
OUTPUT plReturn,
OUTPUT pcReturn) NO-ERROR.
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.
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.
Suscribirse a:
Entradas (Atom)