Por ejemplo, tenemos diferentes DB con información de ciertos productos que en función del producto, lo tenemos que copiar a un DB.
Podrías decir, bueno, en función del producto, hago una copia del DB del producto al DB final y ya está...
Hombre, pues sí, pero digamos, que es mucho trabajo y poco elegante. Porque si en vez de ser 10, ¿son 100?
Cómo copiar datos de forma dinámica en Step 7
Pues resulta que la solución es realmente fácil usando direccionamiento indirecto en Step 7.
Imaginemos que los DB donde tenemos la información son del estilo DB100 + Número de producto, es decir:
- DB101 para el producto 1
- DB102 para el producto 2
- DB103 para el producto 3 ...
Y así con todos.
Imaginemos, a su vez, que el DB destino es el DB1 (por poner un ejemplo) y que queremos copiar 50 bytes.
Bien.. ¿cómo copiar datos de forma dinámica? Pues realmente de una forma muy sencilla.
Lo primero que debemos tener en cuenta que para realizar este tipo de ejercicios podemos usar la apertura de los db de dos formas:
- AUF DB
- AUD DI
Sí, porque de esta manera, la solución es realmente sencilla.
Una vez sepamos el número de producto a copiar, tan solo deberemos usar la función SFC20 (Block Move) para solucionar nuestro problema.
L #NumeroProducto //Leemos nuestro número de producto que indica el DB que almacena la información
L 100
+ I
T #NumeroDB // Sumamos el número de producto 100 unidades para obtener el número de DB a usar
AUF DI[#NumeroDB] //Abrimos el DB
CALL "BLKMOV" SRCBLK :=P#DIX 0.0 BYTE 50 RET_VAL:=MW0 DSTBLK :=P#DB1.DBX 0.0 BYTE 50
¡Y ya está!
Como ves, en la solución, manejamos 2 conceptos:
- Apertura de los bloques con AUF DI para abrir el bloque origen, y luego el puntero lo hacemos relativo a esa apertura simplemente leyendo 50 bytes del bloque abierto con AUF DI
- Puntero absoluto de 50 bytes al DB1 destino
¿El destino podría ser dinámico a su vez?
Claaaaro. Si en vez de haber usado, el DB1, quisieramos usar un #DBDestino, podríamos hacer análogamente:
L #NumeroProducto //Leemos nuestro número de producto que indica el DB que almacena la información
L 100
+ I
T #NumeroDB // Sumamos el número de producto 100 unidades para obtener el número de DB a usar
AUF DI[#NumeroDB] //Abrimos el DB origen
AUF DB[#DBDestino] // Abrimos el DB destino
CALL "BLKMOV" SRCBLK :=P#DIX 0.0 BYTE 50 RET_VAL:=MW0 DSTBLK :=P#DBX 0.0 BYTE 50
Como ves, esto de cómo copiar datos de forma dinámica en Step 7 es muy útil si quieres pasar información entre bloques.
¿Qué te ha parecido? ¿Te parece útil?




