Pregunta

Esta es mi tercera pregunta aquí, hasta ahora excelentes respuestas ^^

Estoy teniendo problemas en la navegación, la edición de los datos, pero inserciones ...

Aquí está mi duda: En un software de finanzas / Stock tengo un formulario para crear un nuevo orden,
naturalmente, tengo que insertar una nueva fila en t_orders Mesa
y el inserto de artículos en t_orderitems mesa con orderId campo vinculado a una fila en t_orders

CREATE TABLE `t_orders` (
    `orderId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `clientId` INT(10) UNSIGNED NOT NULL,
    ...)

CREATE TABLE `t_orderitems` (
    `orderitemId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `orderId` INT(10) UNSIGNED NOT NULL,
    ...)

--> INDEXES AND FOREIGN KEYS OMITTED <--

¿Cómo puedo añadir itemorders a una rejilla y, finalmente, en "FinalizeOrder" clic de botón

  • Crear un orden en el t_orders
  • Insertar elementos en t_orderitems vinculado a ese orden

conexión se realiza mediante ADO.

No estoy seguro si es posible hacerlo así, en ese caso, cómo debo hacer?

editar: He intentado utilizar ClientDataSets anidados y funciona en algunas partes, pero todavía no sé cómo obtener el ID del pedido de insertar

Edit2:
ahora tengo otro problema, no puedo añadir más de un artículo en el ClientDataSet.
Debido OrderItemId está vacía para todos los elementos (i sólo puede conseguir que los valores al insertar la base de datos), cuando intento añadir un segundo elemento que me da Violación clave, cualquier idea ??

Si fijo UpdateMode a algo diferente que upWhereKeyOnly y establecer pfInKey en False funciona, pero no creo que es una opción

¿Alguna idea?

Gracias de antemano!
Arthur.

¿Fue útil?

Otros consejos

I se supone que tiene un conjunto de datos de ADO que obtiene datos de su base de datos y está vinculado a la red? Lo que hay que hacer esto es una capa intermedia.

Crear un TClientDataset y conectarlo a su conjunto de datos ADO, a continuación, conectar la red para el conjunto de datos de clientes. Cuando un nuevo orden entra, llame Anexar en el conjunto de datos de clientes e insertar los datos para el nuevo orden en ella. Esto hará que se muestre en la parrilla. Cuando se quiere guardar los cambios en la base de datos, llamar .Update en el conjunto de datos de clientes. It'l utilizan el conjunto de datos de ADO que está vinculada a enviar los cambios a la base de datos. Consulte la documentación de TClientDataset explicaciones sobre cómo hacer esto todo para arriba; que es una de las pocas cosas en las versiones más recientes que en realidad muy bien documentadas.

Para actualizar varias tablas, vistazo a la documentación sobre las relaciones maestro / detalle y el uso de dos conjuntos de datos de este tipo, vinculados entre sí.

Si haces una relación maestro-datos entre los dos conjuntos de datos en la aplicación, ADO puede manejar de forma automática. Eso significa que, una vez que se inserta un nuevo registro en el conjunto de datos maestro (órdenes), se puede insertar nuevos registros en su detalles conjunto de datos (order_items) sin la necesidad de especificar order_id, porque order_id para el registro actual en el conjunto de datos maestro se recuperará automáticamente, y insertado en los registros recién insertados de detalles conjunto de datos.

Para hacer un / detalles relación maestro entre los conjuntos de datos, si está utilizando ADOTable para el detalle de datos, puede configurar su MasterSource a un origen de datos conectado a la base de datos maestra, y definir relatinship entre los dos conjuntos de datos utilizando la propiedad MasterFields. Si está utilizando AdoDataset o AdoQuery, debe establecer la propiedad DataSource en detalle el conjunto de datos de un origen de datos conectado a la base de datos maestra. Después hay que añadir una cláusula WHERE en la instrucción SQL su detalle del conjunto de datos utilizando un parámetro de SQL con el mismo nombre que el campo clave en el conjunto de datos maestro. En su caso, sería algo como esto:

SELECT * FROM t_orderitems WHERE OrderID = :OrderID

Ahora usted puede configurar su relación en la MasterFields propiedad de sus detalles conjunto de datos.

Desde sus pedidos pueden tener varios elementos, se puede establecer LockType a ltBatchOptimistic en el conjunto de datos detalle (order_items), por lo que una vez que se inserta un nuevo elemento, no se envía a la base de datos inmediatamente. Usando ltBatchOptimistic significa los cambios se guardan en la memoria del cliente temporalmente hasta que llame método UpdateBatch. UpdateBatch envía todos los cambios a la base de datos.

Si desea cancelar el pedido, usted tiene que llamar CancelBatch método para cancelar las modificaciones realizadas en los detalles conjunto de datos, y eliminar el registro de orden creado en el conjunto de datos maestra de forma manual.

Gracias RRUZ, esto no es exactamente lo que quería (todavía tengo que configurar manualmente todos los artículos de pedido de OrderId manualmente antes de la inserción), pero lo haré

with DataModule1.ADOQuery1 do
begin
  SQL.Text := 'SELECT LAST_INSERT_ID()';
  Open();
  First();
  LastInsertId := Fields[0].Value;
  Close();
end;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top