Archivo

Posts Tagged ‘Código fuente’

Función en JavaScript que despliega un reloj siguiendo al cursor.

<SCRIPT language=JavaScript>
dCol=’ffffff’;//date colour.
fCol=’00ffff’;//face colour.
sCol=’ffffff’;//seconds colour.
mCol=’ccff00′;//minutes colour.
hCol=’ffff00′;//hours colour.
ClockHeight=40;
ClockWidth=40;
ClockFromMouseY=0;
ClockFromMouseX=100;

//Alter nothing below! Alignments will be lost!

d=new Array(“DOMINGO”,”LUNES”,”MARTES”,”MIERCOLES”,”JUEVES”,”VIERNES”,”SABADO”);
m=new Array(“ENERO”,”FEBRERO”,”MARZO”,”ABRIL”,”MAYO”,”JUNIO”,”JULIO”,
“AGOSTO”,”SEPTIEMBRE”,”OCTUBRE”,”NOVIEMBRE”,”DICIEMBRE”);
date=new Date();
day=date.getDate();
year=date.getYear();
if (year < 2000) year=year+1900;
TodaysDate=” “+d[date.getDay()]+” “+day+” “+m[date.getMonth()]+” “+year;
D=TodaysDate.split(”);
H=’…’;
H=H.split(”);
M=’….’;
M=M.split(”);
S=’…..’;
S=S.split(”);
Face=’1 2 3 4 5 6 7 8 9 10 11 12′;
font=’Arial’;
size=1;
speed=0.6;
ns=(document.layers);
ie=(document.all);
Face=Face.split(‘ ‘);
n=Face.length;
a=size*10;
ymouse=0;
xmouse=0;
scrll=0;
props=”<font face=”+font+” size=”+size+” color=”+fCol+”><B>”;
props2=”<font face=”+font+” size=”+size+” color=”+dCol+”><B>”;
Split=360/n;
Dsplit=360/D.length;
HandHeight=ClockHeight/4.5
HandWidth=ClockWidth/4.5
HandY=-7;
HandX=-2.5;
scrll=0;
step=0.06;
currStep=0;
y=new Array();x=new Array();Y=new Array();X=new Array();
for (i=0; i < n; i++){y[i]=0;x[i]=0;Y[i]=0;X[i]=0}
Dy=new Array();Dx=new Array();DY=new Array();DX=new Array();
for (i=0; i < D.length; i++){Dy[i]=0;Dx[i]=0;DY[i]=0;DX[i]=0}
if (ns){
for (i=0; i < D.length; i++)
document.write(‘<layer name=”nsDate’+i+'” top=0 left=0 height=’+a+’ width=’+a+’><center>’+props2+D[i]+'</font></center></layer>’);
for (i=0; i < n; i++)
document.write(‘<layer name=”nsFace’+i+'” top=0 left=0 height=’+a+’ width=’+a+’><center>’+props+Face[i]+'</font></center></layer>’);
for (i=0; i < S.length; i++)
document.write(‘<layer name=nsSeconds’+i+’ top=0 left=0 width=15 height=15><font face=Arial size=3 color=’+sCol+’><center><b>’+S[i]+'</b></center></font></layer>’);
for (i=0; i < M.length; i++)
document.write(‘<layer name=nsMinutes’+i+’ top=0 left=0 width=15 height=15><font face=Arial size=3 color=’+mCol+’><center><b>’+M[i]+'</b></center></font></layer>’);
for (i=0; i < H.length; i++)
document.write(‘<layer name=nsHours’+i+’ top=0 left=0 width=15 height=15><font face=Arial size=3 color=’+hCol+’><center><b>’+H[i]+'</b></center></font></layer>’);
}
if (ie){
document.write(‘<div id=”Od” style=”position:absolute;top:0px;left:0px”><div style=”position:relative”>’);
for (i=0; i < D.length; i++)
document.write(‘<div id=”ieDate” style=”position:absolute;top:0px;left:0;height:’+a+’;width:’+a+’;text-align:center”>’+props2+D[i]+'</B></font></div>’);
document.write(‘</div></div>’);
document.write(‘<div id=”Of” style=”position:absolute;top:0px;left:0px”><div style=”position:relative”>’);
for (i=0; i < n; i++)
document.write(‘<div id=”ieFace” style=”position:absolute;top:0px;left:0;height:’+a+’;width:’+a+’;text-align:center”>’+props+Face[i]+'</B></font></div>’);
document.write(‘</div></div>’);
document.write(‘<div id=”Oh” style=”position:absolute;top:0px;left:0px”><div style=”position:relative”>’);
for (i=0; i < H.length; i++)
document.write(‘<div id=”ieHours” style=”position:absolute;width:16px;height:16px;font-family:Arial;font-size:16px;color:’+hCol+’;text-align:center;font-weight:bold”>’+H[i]+'</div>’);
document.write(‘</div></div>’);
document.write(‘<div id=”Om” style=”position:absolute;top:0px;left:0px”><div style=”position:relative”>’);
for (i=0; i < M.length; i++)
document.write(‘<div id=”ieMinutes” style=”position:absolute;width:16px;height:16px;font-family:Arial;font-size:16px;color:’+mCol+’;text-align:center;font-weight:bold”>’+M[i]+'</div>’);
document.write(‘</div></div>’)
document.write(‘<div id=”Os” style=”position:absolute;top:0px;left:0px”><div style=”position:relative”>’);
for (i=0; i < S.length; i++)
document.write(‘<div id=”ieSeconds” style=”position:absolute;width:16px;height:16px;font-family:Arial;font-size:16px;color:’+sCol+’;text-align:center;font-weight:bold”>’+S[i]+'</div>’);
document.write(‘</div></div>’)
}
(ns)?window.captureEvents(Event.MOUSEMOVE):0;
function Mouse(evnt){
ymouse = (ns)?evnt.pageY+ClockFromMouseY-(window.pageYOffset):event.y+ClockFromMouseY;
xmouse = (ns)?evnt.pageX+ClockFromMouseX:event.x+ClockFromMouseX;
}
(ns)?window.onMouseMove=Mouse:document.onmousemove=Mouse;
function ClockAndAssign(){
time = new Date ();
secs = time.getSeconds();
sec = -1.57 + Math.PI * secs/30;
mins = time.getMinutes();
min = -1.57 + Math.PI * mins/30;
hr = time.getHours();
hrs = -1.575 + Math.PI * hr/6+Math.PI*parseInt(time.getMinutes())/360;
if (ie){
Od.style.top=window.document.body.scrollTop;
Of.style.top=window.document.body.scrollTop;
Oh.style.top=window.document.body.scrollTop;
Om.style.top=window.document.body.scrollTop;
Os.style.top=window.document.body.scrollTop;
}
for (i=0; i < n; i++){
var F=(ns)?document.layers[‘nsFace’+i]:ieFace[i].style;
F.top=y[i] + ClockHeight*Math.sin(-1.0471 + i*Split*Math.PI/180)+scrll;
F.left=x[i] + ClockWidth*Math.cos(-1.0471 + i*Split*Math.PI/180);
}
for (i=0; i < H.length; i++){
var HL=(ns)?document.layers[‘nsHours’+i]:ieHours[i].style;
HL.top=y[i]+HandY+(i*HandHeight)*Math.sin(hrs)+scrll;
HL.left=x[i]+HandX+(i*HandWidth)*Math.cos(hrs);
}
for (i=0; i < M.length; i++){
var ML=(ns)?document.layers[‘nsMinutes’+i]:ieMinutes[i].style;
ML.top=y[i]+HandY+(i*HandHeight)*Math.sin(min)+scrll;
ML.left=x[i]+HandX+(i*HandWidth)*Math.cos(min);
}
for (i=0; i < S.length; i++){
var SL=(ns)?document.layers[‘nsSeconds’+i]:ieSeconds[i].style;
SL.top=y[i]+HandY+(i*HandHeight)*Math.sin(sec)+scrll;
SL.left=x[i]+HandX+(i*HandWidth)*Math.cos(sec);
}
for (i=0; i < D.length; i++){
var DL=(ns)?document.layers[‘nsDate’+i]:ieDate[i].style;
DL.top=Dy[i] + ClockHeight*1.5*Math.sin(currStep+i*Dsplit*Math.PI/180)+scrll;
DL.left=Dx[i] + ClockWidth*1.5*Math.cos(currStep+i*Dsplit*Math.PI/180);
}
currStep-=step;
}
function Delay(){
scrll=(ns)?window.pageYOffset:0;
Dy[0]=Math.round(DY[0]+=((ymouse)-DY[0])*speed);
Dx[0]=Math.round(DX[0]+=((xmouse)-DX[0])*speed);
for (i=1; i < D.length; i++){
Dy[i]=Math.round(DY[i]+=(Dy[i-1]-DY[i])*speed);
Dx[i]=Math.round(DX[i]+=(Dx[i-1]-DX[i])*speed);
}
y[0]=Math.round(Y[0]+=((ymouse)-Y[0])*speed);
x[0]=Math.round(X[0]+=((xmouse)-X[0])*speed);
for (i=1; i < n; i++){
y[i]=Math.round(Y[i]+=(y[i-1]-Y[i])*speed);
x[i]=Math.round(X[i]+=(x[i-1]-X[i])*speed);
}
ClockAndAssign();
setTimeout(‘Delay()’,20);
}
if (ns||ie)window.onload=Delay;
</SCRIPT>

Como crear un XML desde un ASP.

Un archivo XML puede ser creado fácilmente desde cualquier editor de texto, hasta Notepad. Pero, ¿que hacemos cuando necesitamos generarlo dinámicamente?

Si no necesitamos guardar una copia en disco duro, podemos simplemente enviar el contenido XML desde nuestra página ASP, estableciendo antes el tipo de contenido a enviar como XML, como en el siguiente ejemplo:
<%
Response.ContentType=”text/xml”

Response.Write(“<?xml version=’1.0′ ?>”)
Response.Write(“<nota>”)
Response.Write(“<de>Jorge</de>”)
Response.Write(“<a>Jose</a>”)
Response.Write(“<mensaje>Hola!</mensaje>”)
Response.Write(“</nota>”)
%>

La razón mas común para generar un XML dinámicamente es que necesitamos extraer datos desde una base de datos, como lo ilustra el siguiente ejemplo:

<%
Response.ContentType = “text/xml”
set conn=Server.CreateObject(“ADODB.Connection”)
conn.provider=”Microsoft.Jet.OLEDB.4.0;”
conn.open server.mappath(“BaseDeDatos.mdb”)
sql=”select nombre, apellido from Clientes”

set rs = Conn.Execute(sql)
rs.MoveFirst()
response.write(“<?xml version=’1.0′ ?>”)
response.write(“<clientes>”)
while (not rs.EOF)
response.write(“<cliente>”)
response.write(“<nombre>” & rs(“nombre”) & “</nombre>”)
response.write(“<apellido>” & rs(“apellido”) & “</apellido>”)
response.write(“</cliente>”)
rs.MoveNext()
wend
rs.close()
conn.close()
response.write(“</clientes>”)
%>

Finalmente, si lo que necesitamos es grabar el archivo XML en disco duro, podemos hacerlo con el objeto Microsoft.XMLDOM:
<%
Dim objDom
Dim objRaiz
Dim objHijo1
Dim objHijo2
Dim objCabecera

‘instanciamos el XMLDOM
Set objDom = Server.CreateObject(“Microsoft.XMLDOM”)

‘instanciamos el elemento raiz y lo agregamos al objeto XMLDOM
Set objRaiz = objDom.createElement(“ElementoRaiz”)
objDom.appendChild objRaiz

‘instanciamos el elemento Hijo1 y lo agregamos al elemento raiz
Set objHijo1 = objDom.createElement(“childElement1”)
objRaiz.appendChild objHijo1

‘instanciamos el elemento Hijo2 y lo agregamos al elemento raiz
Set objHijo2 = objDom.createElement(“childElement2”)
objRaiz.appendChild objHijo2

objDom.createProcessingInstruction(“xml”,”version=’1.0′”)

‘agregamos la cabecera antes del elemento raiz
bjDom.insertBefore objCabecera, objDom.childNodes(0)

‘finalmente grabamos el XML en disco duro
objDom.Save “c:MiArchivoXML.xml”
%>

Así hemos revisado las distintas formas de generar XML desde ASP. En próximas entregas veremos como manipular nodos con el objeto XMLDOM.
Autor: Jorge González

Original de WebExperto

Creación de tablas desde un procedimiento almacenado en la Base de datos (Oracle)

marzo 24, 2009 2 comentarios

Dentro de los conceptos más buscados encontré que muchas personas buscan éste tipo de código, así que para todas ellas aquí les vá, y cómo siempre,   para mí, un ejemplo es mucho más sencillo de aprender, que todo un pergamino de explicaciones, así que, cualquier duda,  solo escribanme.

PROCEDURE “CREA_TABLAS” (P_CODIGO_FORMULARIO IN NUMBER)
IS
CURSOR CONCEPTOS IS
SELECT CODIGO_CONCEPTO, CODIGO_FORMULARIO, NOMBRE_DEL_CAMPO
FROM DM_CONCEPTOS_FORMULARIOS
WHERE CODIGO_FORMULARIO = P_CODIGO_FORMULARIO
ORDER BY CODIGO_CONCEPTO;
DDL VARCHAR2(32767);
BEGIN
EXECUTE IMMEDIATE  ‘DROP TABLE TEMP_’||TO_CHAR(P_CODIGO_FORMULARIO);

DDL := ‘CREATE TABLE TEMP_’||TO_CHAR(P_CODIGO_FORMULARIO)||’ (‘;
DDL := DDL || ‘ANIO NUMBER(4), ‘;
DDL := DDL || ‘MES NUMBER(2), ‘;
FOR J IN CONCEPTOS LOOP
DDL := DDL ||TO_CHAR(J.NOMBRE_DEL_CAMPO)||’ NUMBER(20,2), ‘;
END LOOP;
DDL := SUBSTR(DDL,1,LENGTH(DDL)-2) || ‘ ) TABLESPACE TBS_TABLAS ‘;

EXECUTE IMMEDIATE DDL;

EXECUTE IMMEDIATE ‘CREATE INDEX I_TEMP_’||TO_CHAR(P_CODIGO_FORMULARIO)||’_FACT ON TEMP_’||TO_CHAR(P_CODIGO_FORMULARIO)||'(ANIO, MES) TABLESPACE TBS_INDICES’;

DBMS_OUTPUT.PUT_LINE(‘PROCESO GENERADOR DE LA TEMP_’||TO_CHAR(P_CODIGO_FORMULARIO)||’ CONCLUIDO SATISFACTORIAMENTE!’);
EXCEPTION WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20912, SQLCODE || ‘,’ || SQLERRM);
END;

Obviamente, si quisieran que éste código funcionára sería necesario crear una tabla llamada “Dm_Conceptos_Formularios”, y que ésta tenga las columnas “Codigo_Concepto”, “Codigo_Formulario” y “Nombre_del_Campo”, por lo demás, sólo bastaría con crear este procedimiento a nivel de base de datos, y listo,… ya tienen un ejemplo de cómo crear tablas dinamicamente desde un procedimiento almacenado.

De igual forma pueden llenar la tabla también desde un procedimiento almacenado, así que espero les sirva.

Saludos.

Query dinamico en procedimiento almacenado (Oracle).

noviembre 13, 2008 5 comentarios

Ayer un usuario de  La Web del programador me contactó porque tenía dudas sobre cómo hacer un Query Dinámico en un procedimiento almacenado en la base de datos, por lo que me gustaría compartir con ustedes la solución, ya que que en su momento yo también anduve buscando por todos lados una solución y no me fué fácil encontrarla.

Personalmente la forma que más utilizo es la siguiente:

DECLARE
  TYPE CUR_TYP IS REF CURSOR;
  c_cursor   CUR_TYP;
  fila PAISES%ROWTYPE;
  v_query     VARCHAR2(255);
BEGIN
  v_query := 'SELECT * FROM PAISES';

  OPEN c_cursor FOR v_query;
  LOOP
    FETCH c_cursor INTO fila;
    EXIT WHEN c_cursor%NOTFOUND;
    dbms_output.put_line(fila.DESCRIPCION);
  END LOOP;
  CLOSE c_cursor;
END;

Tomar en cuenta que  la variable “fila” es de tip “ROWTYPE”,  o sea que contiene los mismos nombres de columnas que los de la tabla y allí es en donde se almacena el resultado del Query.

Espero haberles ayudado en algo, y espero sus comentarios.   !! Saludos !!.

Código para convertir de Número a Letras

octubre 17, 2008 6 comentarios

Uno de los proyectos que más piden en las clases de programación en los colegios o universidades es la conversión de números a letras, por algún tiempo me la pasé buscando y encontré varias soluciones en Visual Basic, en C, en PHP, en ASP, en fin, en tantas herramientas, pero en PL/SQL de Oracle !!!   fué casi misión imposible, por lo que aquí les comparto una para quienes les pueda servir, … no hay que inventar el agua azucarada.

— Start of DDL script for NUMTOLETRAS

— Function NUMTOLETRAS

CREATE OR REPLACE
FUNCTION NUMTOLETRAS (Numero Number) RETURN Varchar2 IS
TYPE Textos IS TABLE OF Varchar2(20)
INDEX BY BINARY_INTEGER;
Texto Textos;
Letras Varchar2(255) := ”;
I BINARY_INTEGER := 0;
EnTexto Varchar2(255);
Unidad Varchar2(255);
Grupo Varchar2(255);
TextoCentena Varchar2(255);
TextoDecena Varchar2(255);
TextoUnidad Varchar2(255);
Y Varchar2(255);
Decimales Varchar2(255);
DigitoCentena Number;
DigitoDecena Number;
DigitoUnidad Number;

BEGIN
Texto(0) := ‘UN ‘;
Texto(1) := ‘UNO ‘;
Texto(2) := ‘DOS ‘;
Texto(3) := ‘TRES ‘;
Texto(4) := ‘CUATRO ‘;
Texto(5) := ‘CINCO ‘;
Texto(6) := ‘SEIS ‘;
Texto(7) := ‘SIETE ‘;
Texto(8) := ‘OCHO ‘;
Texto(9) := ‘NUEVE ‘;
Texto(10):= ‘DIEZ ‘;
Texto(11):= ‘VEINTE ‘;
Texto(12) := ‘TREINTA ‘;
Texto(13) := ‘CUARENTA ‘;
Texto(14) := ‘CINCUENTA ‘;
Texto(15) := ‘SESENTA ‘;
Texto(16) := ‘SETENTA ‘;
Texto(17) := ‘OCHENTA ‘;
Texto(18) := ‘NOVENTA ‘;
Texto(19) := ‘ONCE ‘;
Texto(20) := ‘DOCE ‘;
Texto(21) := ‘TRECE ‘;
Texto(22) := ‘CATORCE ‘;
Texto(23) := ‘QUINCE ‘;
Texto(24) := ‘CIEN ‘;
Texto(25) := ‘CIENTO ‘;
Texto(26) := ‘DOSCIENTOS ‘;
Texto(27) := ‘TRESCIENTOS ‘;
Texto(28) := ‘CUATROCIENTOS ‘;
Texto(29) := ‘QUINIENTOS ‘;
Texto(30) := ‘SEISCIENTOS ‘;
Texto(31) := ‘SETECIENTOS ‘;
Texto(32) := ‘OCHOCIENTOS ‘;
Texto(33) := ‘NOVECIENTOS ‘;
Texto(34) := ‘MIL ‘;
Texto(35) := ‘MILLON ‘;
Texto(36) := ‘MILLONES ‘;

EnTexto := ltrim(rtrim(TO_CHAR(TRUNC(Numero), ‘99999999999’))); —       ‘ Convirtiendo el numero a un string de 12 posiciones.
EnTexto:=lpad(EnTexto,12,’0’);        — Rellena de 0’s

— Este ciclo recorre el numero de tres en tres posiciones.
FOR I IN 1..4 LOOP
Grupo := SUBSTR(EnTexto, I * 3 – 2, 3);    — Obtiene el grupo de tres digitos segun el contador del ciclo.

— Establece las unidades a usar: “mil” o “millon”
IF I=1 or I=3 THEN
Unidad := Texto(34);
ELSE
If I = 2 THEN
IF TO_NUMBER(Grupo)=1 THEN
Unidad := Texto(35);
ELSE
Unidad:= Texto(36);
END IF;
ELSE
Unidad := ”;
END IF;
END IF;

— Si hay un numero el grupo lo evalua, sino sigue con el siguiente grupo.
If TO_NUMBER(Grupo) > 0 Then
If TO_NUMBER(Grupo) = 1 Then   — Por los casos de “mil” o “un millon” se evalua cuando el valor sea 1.
IF I = 2 THEN
TextoUnidad := Texto(0);
ELSE
IF I=4 THEN
TextoUnidad := Texto(1);
ELSE
TextoUnidad := ”;
END IF;
END IF;
Letras := Letras || TextoUnidad || Unidad;
ELSE   —                         ‘ Los demas casos que no son 1.
— Se asignan a variables cada digito del grupo de tres.
DigitoCentena := TO_NUMBER(SUBSTR(Grupo, 1, 1));
DigitoDecena  := TO_NUMBER(SUBSTR(Grupo, 2, 1));
DigitoUnidad  := TO_NUMBER(SUBSTR(Grupo, 3, 1));

— Si hay algo en los cientos lo analiza sino lo deja pasar.
If DigitoCentena <> 0 Then
— En el caso que sea 100 le asigna de una vez, sino el texto que le corresponde segun la
— posicion en el vector.
IF Grupo = ‘100’ THEN
TextoCentena := Texto(24);
ELSE
TextoCentena := Texto(24 + DigitoCentena);
END IF;
End If;

— Analiza sino se encuentra entre el 11 y el 15.
If DigitoDecena = 1 And DigitoUnidad >= 1 And DigitoUnidad <= 5 Then
TextoDecena := Texto(18 + DigitoUnidad);
TextoUnidad := NULL;
Y           := NULL;

— Evalua Los demas numeros fuera del 11 al 15.
Else
— Si hay numero en las decenas asigna la posicion correspondiente en el vector.
IF DigitoDecena <> 0 THEN
TextoDecena := Texto(9 + DigitoDecena);
ELSE
TextoDecena := ”;
END IF;

— Si hay numero en las unidades asigna la posicion correspondiente en el vector.
IF DigitoUnidad <> 0 THEN
TextoUnidad := Texto(DigitoUnidad);
ELSE
TextoUnidad := ”;
END IF;

— Evalua si hay que conectar con “y”.
IF DigitoUnidad > 0 AND DigitoDecena > 0 THEN
Y := ‘Y ‘;
ELSE
Y := ”;
END IF;
End If;
— Une los textos generados en este grupo y los va agregando al resultado
— de la funcion letras.
Letras := Letras || TextoCentena || TextoDecena || Y || TextoUnidad || Unidad;

END IF;
END IF;

END LOOP;

— Evalua si hay decimales.
IF TRUNC(Numero) = Numero THEN
Decimales := ‘EXACTOS’;
ELSE
Decimales := ‘CON ‘||SUBSTR(TO_CHAR(Numero, ‘99999999999.99’),14,2)  || ‘/00’;
END IF;
— Une los decimales al valor de retorno de la funcion.
Letras := Letras || Decimales;

RETURN Letras;
EXCEPTION
WHEN OTHERS THEN
RETURN ‘NO CONVERTIDO’;
END;
/

— End of DDL script for NUMTOLETRAS

Categorías:Oracle Etiquetas: