La única manera es guardar el NextVal, asignarlo y devolverlo. Es
consecuente con el estilo Oracle donde todo se hace por Stored Procedures.
Andá a preguntale a un DBA de Oracle si podés hacer un select sobre una base
de datos y después contame qué obcenidades te gritó.   :)

Salutes,
   /ms

On 6/4/07, Lucas Fabbi <[EMAIL PROTECTED]> wrote:

Hola
Si el Scope_Identity() la tengo... para SQL...
En Fox uso el Afields() posiscion 17
y en Oracle hago algo parecido ... una vez que inserto pregunto cual es el
ultimo valor insertado y lo guardo en la tabla
pero me parece muy casero...pregunte en un foro de Oracle si hay algo que
genere o te diga el autoincremental que es el que me esta faltando... la
unica forma es manual en el Oracle????
Gracias
Lucas



----- Mensaje original ----
De: Martin Salias <[EMAIL PROTECTED]>
Para: GUFA List Member <[email protected]>
Enviado: lunes 4 de junio de 2007, 15:23:39
Asunto: [GUFA] : Proximo Valor Incremental

Hola, Lucas.

Entonces es lo que yo suponía, que no es que necesites saber el próximo
número en cualquier momento, sino para poblar las FK de las tablas hijas
dentro de la transacción. En ese caso lo que tenés que usar en SQL Server
es Scope_Identity(), que te da el ID que acaba de tomar en tu conexión.
@@Identity puede darte otro si en el medio alguien insertó otro registro
desde otra conexión, o si un Trigger generó otros.

En Oracle no hay identities, sino sequences, así que tenés que hacer una
tarea más manual que es tomar el NextVal del campo, guardarlo en una
variable, usarlo en el insert y devolverlo.

Por esta razón en general es preferible hacer estas inserciones completas
adentro de un SP, así no tenés que andar yendo y viniendo con los IDs. Se
graba todo o nada, y la manera de "bajar" la PK de la cabecera a las hijas
queda toda dentro del SP, según el sabor de cada DB.

¿A qué DBs estás apuntando?

Saludos,
    /ms


On 6/4/07, Lucas Fabbi <[EMAIL PROTECTED] > wrote:
>
>  Gracias Martin
> El tema de diseno no creo que este mal
> El sistema que es de patentes y crecio ..... la tabla que se usaba tuvo
> que ser Cabecera - Detalle
> asi que tuve que hacer para cada motor que devuelva la pk con las
> transacciones correspondientes
> pero pense que se podia obtener con un Select....  Select @@Identity,
> Select Max(id)  o lo que sea pero generico...
> por lo que me entere ... no hay un metodo generico para obtener el Id...
>
> Saludos y muchas gracias a todos
> Lucas
>
>
>
> ----- Mensaje original ----
> De: Martin Salias < [EMAIL PROTECTED]>
> Para: GUFA List Member <[email protected]>
> Enviado: lunes 4 de junio de 2007, 13:59:03
> Asunto: [GUFA] : Proximo Valor Incremental
>
> Hola, Lucas.
>
> Acá me parece que se está pasando por alto una pregunta fundamental que
> es: ¿para qué necesita saber el próximo valor de un autoincremental? Te lo
> digo porque huele mal que necesite saberlo. Los autoincrementales deberían
> usarse para claves surrogadas, y por lo tanto no es lgo que tenga que
> interesarle al código cliente (o sea que no debería aparecer nunca en la
> UI).
>
> Ahora, si el tema es ver el valor de lo que se acaba de insertar porque
> hay que usarlo como FK en otras tablas a grabar en la misma transacción,
> entonces si, cada motor tiene una manera diferente, y lo ideal es poner un
> método en la DAL -como decía OZ- para que lo recupere a través de un SP o un
> Select según lo que el motor soporte.
>
> Si lo que se necesita es tomar algo como el próximo número de factura,
> por ejemplo (que idealmente NO debería ser primary, sino solamente parte de
> una candidate), no deberías usar un autoincremental, sino la típica tabla en
> la que vas tomando números. ¿Por qué? Porque los números que tienen un
> significado en el sistema son algo que tenés que poder manejar -volver a
> cero, saltear n números, avanzar uno- y además las posibilidades de que de
> golpe necesites tener dos series de números diferentes (dos puestos de
> facturación, etc) son demasiado grandes.
>
> Los autoincrementales tienen que usarse sólo para claves surrogadas, es
> decir las que se usan para IDs y que NO tienen un sentido más allá el modelo
> relacional.
>
> Por supuesto, no soy dogmático y si tiene un escenario particular por el
> que si necesite esto, tendrá que hacerlo, pero en principio, suena mi alarma
> de problema de diseño. Contame si el caso es especial y vemos qué otas
> alternativas hay.
>
> Saludos,
>     /ms
>
>
> On 6/4/07, Lucas Fabbi <[EMAIL PROTECTED] > wrote:
> >
> >  Ok...
> > esta en transacciones asi que tendre que ver como se hace con cada
> > motor
> > yo puse Set Deleted off.... y me funciono en Native y SQL.. pero no en
> > oracle
> > Saludos
> > Lucas
> >
> > ----- Mensaje original ----
> > De: David Brunstein < [EMAIL PROTECTED]>
> > Para: GUFA List Member <[email protected]>
> > Enviado: lunes 4 de junio de 2007, 0:32:28
> > Asunto: [GUFA] : Proximo Valor Incremental
> >
> > Hola Lucas,
> > Que tal?
> >
> > Lamentable SELECT MAX(ElCampoAutoincremental) no puede adivinar que
> > borraste el ultimo registro.
> > Las formas de averiguar el autoincremental que siga como ya te diste
> > cuenta depende del motor de base de datos que estas usando. Cada uno lo hace
> > como mejor le parece.
> >
> > Una solucion es poner codigo especifico del motor que uses en la capa
> > de datos. Leyendo la configuracion del sistema sabes contra que motor te
> > estas conectando y ejecutas el codigo especifico para obtener el
> > autoincremental que corresponda.
> >
> > Otra solucion es tener una tabla en la que llevas registro del
> > autoincremental que siga. Ojo con los accesos multiples a esta tabla. tenes
> > que trabajar con transacciones para asegurarte que dos mas usuarios te
> > tomaron el mismo autoincremental. O sea, insertas un nuevo registro en esta
> > tabla, tomas el autoincremental, y lo repartis por las PK que corresponda
> > DENTRO DE LA TRANSACCION SQL. Al final haces el COMMIT o ROLLBACK (segun
> > corresponda) para permitir que otro usuario haga su peticion.
> >
> > Espero que te sirva,
> > Saludos,
> > Davo.
> >
> >
> >
> > On 6/3/07, Lucas Fabbi <[EMAIL PROTECTED] > wrote:
> > >
> > >  Hola
> > > Un amigo me consulto algo y no le supe responder asi que aca va la
> > > pregunta...
> > > Hay una aplicacion muy simple corriendo en varios lugares con
> > > distintos motores de Datos.. Sql, nativo Oracle...
> > > bien la pregunta es..... Como se pueede saber el proximo valor de un
> > > campo autoincremental.??
> > > a mi se me ocurrio Select Max(ElCampoAutoIncremental) from Tabla..
> > > funciona bien... pero la caga cuando tenes borrado el ultimo
> > > registro
> > > o sea tenes la tabla
> > >
> > > id(autoIncremental)......Campo 1 campo2 ... etc
> > > 1                                slfksdlf          slkflsdk
> > > 2                                lfsfnsdf            zñlfksdlfs
> > > 3                                masoais            sodisodfi
> > >
> > > si hago el select funciona porque me devuelve el 4... pero si borro
> > > el registro con el id 3... hago el select y me devuelve 3 .. cuando en
> > > realidad tendria que ser cuatro...
> > >
> > > estuve mirando el Afileds() pero solo me sirve para las DBFs... con
> > > la posicion 17 me da el autoincremental... el siguiente valor....
> > >
> > > a alguien se le ocurre algo???
> > >
> > > Gracias
> > > Lucas
> > >
> > >
> > >
> > > ------------------------------
> > > *Preguntá. Respondé. Descubrí.*
> > > Todo lo que querías saber, y lo que ni imaginabas,
> > > está en *Yahoo! Respuestas* (Beta).
> > > *Probalo ya! <http://ar.answers.yahoo.com/>*
> > >
> >
> >
> >
> > --
> > =======================
> > David Brunstein
> >
> > Java/PB/VFP Developer
> > Winnipeg, MB
> > Canada
> >
> > Before I speak, I have something important to say.
> > Antes de dar mi discurso, tengo algo importante que decir.
> > Antes de dar meu discurso, tenho algo importante para dizer.
> > G.M.
> >
> >
> > ------------------------------
> > *Preguntá. Respondé. Descubrí.*
> > Todo lo que querías saber, y lo que ni imaginabas,
> > está en *Yahoo! Respuestas* (Beta).
> > *Probalo ya! <http://ar.answers.yahoo.com/>*
> >
>
>
>
> --
> Martín Salías
> www.Salias.com.ar <http://www.salias.com.ar/>
> Agile Alliance Member - Microsoft MVP
>
>
> ------------------------------
> *Preguntá. Respondé. Descubrí.*
> Todo lo que querías saber, y lo que ni imaginabas,
> está en *Yahoo! Respuestas* (Beta).
> *¡Probalo ya! <http://ar.answers.yahoo.com/>*
>



--
Martín Salías
www.Salias.com.ar <http://www.salias.com.ar/>
Agile Alliance Member - Microsoft MVP


------------------------------
*Preguntá. Respondé. Descubrí.*
Todo lo que querías saber, y lo que ni imaginabas,
está en *Yahoo! Respuestas* (Beta).
*¡Probalo ya! <http://ar.answers.yahoo.com>*




--
Martín Salías
www.Salias.com.ar
Agile Alliance Member - Microsoft MVP

Responder a