Archive for May, 2007

Run-time error 1060 GeneXus Invalid descriptor index

Saturday, May 26th, 2007


Básicamente este error se refiere a que un programa generado con GeneXus hace referencia a una campo en una tabla que no existe.
Esto se puede deber a varias cosas, una de ellas es algun manejo que se haya hecho con la tabla, al quitar algún campo, algo que realmente no debería pasar si se controla siempre el modelo de base de datos con GeneXus.
Otra de las cosas que puede pasar, y es un poco más fácil de errar, es que hayamos definido un DataView en GeneXus con tabla asociada y que simplemente en la parte de “Composition” no completamos el “external name” o tenemos alguna diferencia en el nombre que colocamos en el external name con el nombre real del campo de la tabla a la cual estamos haciendo referencia.

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Diferencia entre Unique y Primary Key Oracle ORA-00001: unique constraint violated

Friday, May 25th, 2007

Diferencia entre Unique y Primary Key en Oracle
ORA-00001: unique constraint violated

Cuando escribía este post, me causó curiosidad de porque este es el error número de 1 de Oracle.
Si bien parece algo bastante fácil de explicar, que es lo que está pasando, les cuento que hace unos días me enfrenté con uno de estos, que me quitó bastante tiempo y creo que es bueno compartirlo.

Resulta que un amigo me pidió ayuda con un problema de unique constraint violated y ahi fui a intentar ayudarlo, con grandes posibilidades de resolverlo inmediatamente, pero… la cosa duró un poco más de lo esperado.

Antes de comenzar quiero explicar un poco la diferencia entre una clave de tipo primary key y una de unique.

La diferencia esta en que una clave unique permite nulos, en cuanto una primary key no permite nulos es decir ya incluye la constraint de not null para cada atributo.

Un ejemplo:

Con Primary key

create table fdls01
(col_a number primary key,
col_b number);

insert into fdls01 values(1,1);
1 linha criada.

insert into fdls01 values(null,2);
ORA-01400: cannot insert NULL into (“esquema1″.”FDLS01″.”COL_A”)

Con Unique

create table fdls02
(col_a number unique,
col_b number);

insert into fdls02 values(1,1);
1 linha criada.

insert into fdls02 values(null,2);
1 linha criada.

Como se puede apreciar, en esta segunda ocasión nos dejó hacer el insert sin problema.

Ahora quiero saber que mensaje me da para las 2 tablas, inentando insertar registros ya existentes:

luego probamos las constraints
insert into fdls01 values(1,1);
ORA-00001: unique constraint (esquema1.SYS_C0032094) violated

insert into fdls02 values(1,1);
ORA-00001: unique constraint (esquema1.SYS_C0032095) violated

Las 2 dan el mismo error

Ahora tomando el nombre de la constraint violada, buscaremos en la vista de constraints, cual es la diferencia entre ellas:

si buscamos la constraint en la vista de constraints

select owner,constraint_name,constraint_type from user_constraints
where constraint_name like ‘%SYS_C0032094%’;

OWNER CONSTRAINT_NAME C
—————————— —————————— –
esquema1 SYS_C0032094 P

select owner,constraint_name,constraint_type from user_constraints
where constraint_name like ‘%SYS_C0032095%’;

OWNER CONSTRAINT_NAME C
—————————— —————————— –
esquema1 SYS_C0032095 U

la diferencia esta en el type

Bien ahora yendo al problema presentado por mi amigo

El problema radicaba en que alguien habia creado una tabla sin usar unique como constraint pero usando indices unique para reflejar lo mismo. Algo que no aconsejo, pero paso a explicar en detalle:

create table fdls03
(col_a number,
col_b number);

notar que no esta la cláusula unique como lo había hecho en los ejemplos anteriores.

y luego creo el indice

create unique index fdls03_pk on fdls03(col_a);

e intento hacer los 2 inserts como lo hice en el ejemplo anterior

insert into fdls03 values(1,1);
1 linha criada.

insert into fdls03 values(null,2);
1 linha criada.

permite hacer el insert porque el nulo vale, y al tratar de insertar otro registro repetido

insert into fdls03 values(1,1);
ORA-00001: unique constraint (esquema1.FDLS03_PK) violated

entonces en mi caso particular me encuentro con un nombre FDLS03_PK
que me confundio totalmente con una pk y entonces fui a buscar a la vista de constraints a ver cual era esa constraint

select owner,constraint_name,constraint_type from user_constraints
where constraint_name like ‘%FDLS03_PK%’;

y opa

não há linhas selecionadas

no existe esa constraint! porque alguien en vez de definirla como constraint
simplemente definio la tabla simple sin constraints y uso un indice unique para controlar esto.

El resultado final se podria decir que es el mismo pero… como complicó la vida.
Ademas tenemos que tener en cuenta que en los casos anteriores un indice puede ser dropeado y la tabla sigue funcionando integramente, si dropeamos este ultimo indice la integridad no sera la misma.

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Tips: Error ORA-01536 space quota exceeded for tablespace GeneXus Oracle 9

Friday, May 11th, 2007

Generalmente en modelos de prototipo, el Analista GeneXus acostumbra dar permiso de DBA al usuario, esquema con que está creando las tablas.

El problema es que al entrar en producción, el dba (real) no los va a dejar probablemente con ese permiso, y ahí es donde a veces comienzan los problemas.

Por ejemplo este error reportado puede producirse usando o no GeneXus.

Error ORA-01536 space quota exceeded for tablespace

Lo primero que uno piensa es que no tenemos espacio en el tablespace, (que también podría ser la causa), pero en realidad es falta de “recursos” ya que nuestro usuario no es más DBA.

En este caso podemos sugerir 3 cosas para ese “amigo” DBA

1 – Dar permisos ilimitados de tablespaces a nuestro usuario.
Lo cual dejará los pelos de punta a nuestro DBA

GRANT UNLIMITED TABLESPACE TO “NUESTRO_USUARIO”

2 – Dar una cuota ilimitada para el tablespace que usa nuestro usuario.
Lo cual limita a nuestro usuario con un máximo que depende del tamaño definido para el tablespace.

ALTER USER “NUESTRO_USUARIO” QUOTA UNLIMITED ON “TABLESPACE_QUE_USA”

3 – Dar una cuota real hasta donde su usuario podrá usar, tanto para crear tablas o insertar registros en las tablas

ALTER USER “NUESTRO_USUARIO” QUOTA 100 M ON “TABLESPACE_QUE_USA”;

Obviamente antes de todo esto “NUESTRO_USUARIO” debería haber sido creado, y con ciertos permisos y recursos, (supongo esto ya que sino el error no sería el que estoy mencionando en el post). De todas formas anexo las sentencias asignar estos recursos.

GRANT “CONNECT” TO “NUESTRO_USUARIO”;
GRANT “RESOURCE” TO “NUESTRO_USUARIO”;
ALTER USER “NUESTRO_USUARIO” DEFAULT ROLE ALL

Aprovecho a anexar como auto extender el datafile para que crezca hasta que tengamos disco.

ALTER DATABASE
DATAFILE ‘D:\ORACLE\ORADATA\ORCL\DATAFILE1.ORA’ AUTOEXTEND
ON NEXT 2M

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Tips: spc0116 Group cannot be ordered by in group starting at line 1 Genexus

Wednesday, May 9th, 2007

El mensaje de error en el help de GeneXus es:

Group cannot be ordered by %1 %2.
The specified order cannot be served.

El problema se produce cuando estas intentando ordenar por un campo que no está en la tabla base que estas recorriendo definido por (defined by) un atributo

Ejemplo

Cabezal de Facturas – tabla FACCAB
FacNro*
FacFch

Lineas de Factura – tabla FACLIN
FacNro*
ArtCod*
FacPrc
FacCnt

y tienes un For Each que desea saber la ultima fecha de factura de un determinado articulo

For Each (FacFch)
Where ArtCod=&ArtCod
Defined by FacCnt
&FacFch=FacFch
exit
EndFor

Esto fue arreglado para el U3 del development enviroment de Genexus.
Pero este error te da si estás especificando en diseño.

Solución, pasate al modelo de prototipo o producción y verás que funciona.

Esto está relacionado al SAC # 19795

Abstract
There is a procedure that scans the table sorted by attributes of the base table and the extended table. It also updates an attribute of the base table and gives the spc0116 error.

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Tips: Run-time error ‘53′: File not found: RBUILDER.DLL GeneXus

Saturday, May 5th, 2007


Este error probablemente se de al copiar un KB a otro pc donde no trabajamos habitualmente, e intentando ejecutar un main.

Puedes ver este post relacionado con esto haciendo click aqui.

En el caso que esto no resuelva tu problema, y ya armaste tu Setup Wizard, descomprime un archivo zip que está en el directorio build, donde guardaste el setup y copia esas dlls al directorio system32 de windows.

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Tips: Run-time error ‘53′: File not found: GxCrypt.dll GeneXus

Saturday, May 5th, 2007


Este error probablemente se de al copiar un KB a otro pc donde no trabajamos habitualmente, e intentando ejecutar un main.

Si estamos instalando GeneXus recientemente en esta maquina o podemos re instalarlo, posiblemente se solucione este problema.

Si no tenemos esta posibilidad, otra opción es crear un setup wizard para ese mismo main, y correrlo en ese pc. Esto registrará las dlls necesarias para poder ejecutar.

Otra opción si conoces cuales son las dlls que estás precisando, puedes copiarlas al directorio system32 de windows.

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Tips: Error ORA-12899 insert value too large GeneXus Oracle

Thursday, May 3rd, 2007

Exportamos una base de datos en Oracle 9 y queremos importar los datos en una base de datos Oracle 10

Nos surge el problema que algunos registros de algunas tablas no son importados y nos aparece el mensaje

IMP-00019: Fila rechazada debido al error ORACLE 12899
IMP-00003: se ha encontrado un error 12899 de ORACLE
ORA-12899: el valor es demasiado grande para la columna “Esquema”.”Tabla”.”Columna”

Este problema es porque la base de datos está configurada para multi-byte y caracteres con tilde o algún símbolo puede ocupar dos bytes lo cual hace sobrepasar la capacidad de almacenamiento.

Solución: Borrar el esquema nuevo en la base de datos Oracle 10. Cambiar la variable de ORACLE

NLS_LENGTH_SEMANTICS para CHAR

alter system set NLS_LENGTH_SEMANTICS=CHAR SCOPE=BOTH;

Reiniciar la base de datos, crear nuevamente el esquema, si estás usando GeneXus hacer un CREATE DATABASE, ahora con la variable setadada para char, las nuevas tablas se crearán contemplando esta propiedad.

Luego importa los datos nuevamente, y debería estar solucionado.

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Tips: Run time error 380 Genexus Setup Wizard

Thursday, May 3rd, 2007


Cuando ejecutamos el Setup Wizard de GeneXus eligiendo una kb en particular, nos muestra el siguiente error:
Run-time error ‘380’: Invalid property value

Esto se debe a que posiblemente la kb que estamos abriendo fue abierta en otro momento con el Setup Wizard de GeneXus y probablemente hacía referencia a una unidad que no la tenemos mapeada en nuestro pc tipo j:\…. o por algún motivo el archivo GXSWInfo.ini está corrupto.

Solución: Renombrar el archivo GXSWInfo.ini y ejecutar nuevamente el GeneXus Setup Wizard.

Existe información relacionada en este SAC de GeneXus

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com