Archivo de la categoría: A3ERP

A3ACTIVEX Objeto produccion

NOTA

Aunque A3 permite que en una misma orden de producción se fabriquen varios productos, YO nunca uso este sistema.

Siempre hago una OP por cada producto a fabricar, para poder identificar solo con el número de OP de que producto estamos hablando.

Tablas y registros

Tablas

En la gestión de producción intervienen las siguientes tablas

CABEPROD: que contiene la cabecera de la OP. La usaremos para poner le número de OP, la fecha, el cliente o algún parametrizable que necesitemos. El campo IDPROD identifica la OP

LINEPROD: que contiene las líneas de la producción, son líneas tanto el producto como los componentes, perfiles maquinas o perfile operarios. El campo IDLINP identifica el registro

PRODFASES: que contiene las fases de la OP. El campo IDFASE identifica el registro de la fase

LOGPROD: cuando se realizan operaciones con la OP, lanzar, consumir, fabricar, etc.. queda registradas en esta tabla

HITPROD: donde quedan registrados los consumos realizados.

Identificar registros

Producto: en la tabla LINEPROD el registro que no tiene nada en CODARTP o el campo signo tiene una F, de fabricar. El campo es CODARTC

Componentes: en la tabla LINEPROD los registros que el campo signo es C y el TIPLIN es A. El campo es CODARTC

Perfiles Maquinas: en la tabla LINEPROD los registros que el campo signo es Q. El campo es PERFILMAQ

Perfiles Operarios: en la tabla LINEPROD los registros que el campo signo es o. El campo es PERFILPER

Ejemplos de código

Ejemplos en VBA para usar el objeto producción. La gestión de errores es propia de Artesania del software

Crear o modificar una OP

Function OPCrearEjemplo

Dim nIDPROD As Long

Dim nIDLINP As Long

Dim nIDFASE As Long

Dim sFecha As String, sTiempo As String

Dim sProducto As String

Dim nCantidadProducto As Double

Dim sFase As String, sFaseDescripcion As String

Dim sPerfilMaq As String

Dim sPerfilOpe As String

Dim sOperario As String

Dim sComponente As String

Dim nCantidadComponente As Double

Call erroresAbrir

Dim naxProduccion As a3ERPActiveX.OrdenProduccion

Set naxProduccion = New a3ERPActiveX.OrdenProduccion

naxProduccion.Iniciar

naxProduccion.Nuevo sFecha

Call Errores

naxProduccion.AsIntegerCab(“NUMDOC”) = 12345

naxProduccion.AsStringCab(“CODCLI”) = 123

naxProduccion.AsStringCab(“REFERENCIA”) = “lo que sea”

Call Errores

‘ Añadir el producto y cantidad a fabricar. A3 carga la estructura del producto automaticamente

nIDLINP = naxProduccion.NuevoProducto(sProducto, nCantidadProducto)

Call Errores

‘Añadir una fase y obtener su ID

nIDFASE = naxProduccion.NuevaFase(nIDLINP, sFase, sFaseDescripcion)

‘ Añadir un perfil maquina

nIDLINP = naxProduccion.NuevaMaquina(nIDFASE, sPerfilMaq, sTiempo)

‘ Añadir un perfil operario aplicando el operario por defecto

nIDLINP = naxProduccion.NuevoOperario(nIDFASE, sPerfilOpe, sTiempo)

‘ Añadir un perfil operario indicando un operario en concreto

nIDLINP = naxProduccion.NuevoOperarioV2(nIDFASE, sPerfilOpe, sTiempo, sOperario)

‘ Añadir un componente

nIDLINP = naxProduccion.NuevoComponente(nIDFASE, sComponente, nCantidadComponente, True)

nIDPROD = naxProduccion.Anade

naxProduccion.Acabar

Call Errores

Call ErroresMostrar

End Function

Consumir

Function OPConsumirEjemplo()

Dim nIDPROD As Long

Dim nIDLINP As Long

Dim sOperario As String, sMaquina As String

Dim sTiempo As String, sFecha As String

Dim nCantidadConsumida As Double

Dim sLote As String

Dim sCaducidad As String

Call erroresAbrir

Dim naxProduccion As a3ERPActiveX.OrdenProduccion

Set naxProduccion = New a3ERPActiveX.OrdenProduccion

naxProduccion.Iniciar

naxProduccion.Modifica nIDPROD

naxProduccion.ConsumirOperario nIDLINP, sOperario, sTiempo, sFecha, “S”

naxProduccion.ConsumirMaquina nIDLINP, sMaquina, sTiempo, sFecha, “S”

naxProduccion.ConsumirComponente nIDLINP, nCantidadConsumida, sFecha, “S”

naxProduccion.IndicarDetalle 0, nIDLINP, nCantidadConsumida, “”, sLote, “”, sCaducidad

Call Errores

naxProduccion.Anade

naxProduccion.Acabar

Call Errores

Call ErroresMostrar

End Function

Terminar Fase

Function OPTerminarFaseEjemplo()

Dim nIDPROD As Long

Dim nIDFASE As Long

Dim sFecha As String

Call erroresAbrir

Dim naxProduccion As a3ERPActiveX.OrdenProduccion

Set naxProduccion = New a3ERPActiveX.OrdenProduccion

naxProduccion.Iniciar

naxProduccion.Modifica nIDPROD

naxProduccion.TerminarFase nIDFASE, sFecha

Call Errores

naxProduccion.Anade

Call Errores

naxProduccion.Acabar

Call Errores

Call ErroresMostrar

End Function

Terminar OP

Function OPTerminarOPEjemplo()

Dim nIDPROD As Long

Dim sFecha As String

Call erroresAbrir

Dim naxProduccion As a3ERPActiveX.OrdenProduccion

Set naxProduccion = New a3ERPActiveX.OrdenProduccion

naxProduccion.Iniciar

naxProduccion.Modifica nIDPROD

naxProduccion.TerminarOrden sFecha

Call Errores

naxProduccion.Anade

naxProduccion.Acabar

Call Errores

Call ErroresMostrar

End Function

Borrar elemento

Dim nIDPROD As Long

Dim nIDLINP As Long

Call erroresAbrir

Dim naxProduccion As a3ERPActiveX.OrdenProduccion

Set naxProduccion = New a3ERPActiveX.OrdenProduccion

naxProduccion.Iniciar

naxProduccion.Modifica nIDPROD

naxProduccion.BorrarLinea nIDLINP

Call Errores

naxProduccion.Anade

naxProduccion.Acabar

Call Errores

Call ErroresMostrar

Fabricar sin consumir

Function OPFabricarEjemplo()

Dim nIDPROD As Long

Dim nIDLINP As Long

Dim sFecha As String

Dim nCantidadFabricada As Double

Dim sLote As String

Dim sCaducidad As String

Call erroresAbrir

Dim naxProduccion As a3ERPActiveX.OrdenProduccion

Set naxProduccion = New a3ERPActiveX.OrdenProduccion

naxProduccion.Iniciar

naxProduccion.Modifica nIDPROD

naxProduccion.FabricarProductoSinConsumir nIDLINP, nCantidadFabricada, sFecha, “S”

naxProduccion.IndicarDetalle 0, nIDLINP, nCantidadFabricada, “”, sLote, “”, sCaducidad

Call Errores

naxProduccion.Anade

naxProduccion.Acabar

Call Errores

Call ErroresMostrar

End Function

Borrar operaciones

Function OPBorrarOperacionesEjemplo()

Dim nIDPROD As Long

‘ Hay que identificar los registros en HISPROD con campos

Dim nIDLINC As Long ‘Identificador de la línea de consumo

Dim nNUMLIN As Long ‘Identificador de detalle de consumo

Call erroresAbrir

Dim naxProduccion As a3ERPActiveX.OrdenProduccion

Set naxProduccion = New a3ERPActiveX.OrdenProduccion

naxProduccion.Iniciar

naxProduccion.Modifica nIDPROD

naxProduccion.DeshacerConsumoOperario nIDLINC, nNUMLIN

naxProduccion.DeshacerConsumoMaquina nIDLINC, nNUMLIN

naxProduccion.DeshacerConsumoComponente nIDLINC, nNUMLIN

naxProduccion.DeshacerFabricacionProducto nIDLINC, nNUMLIN

naxProduccion.Anade

Call Errores

naxProduccion.Acabar

Call Errores

Call ErroresMostrar

End Function

Anticipos, cartera pendiente y saldos

Esta vista SQL permite ver el estado de la cartera de los clientes, separado por anticipos y cartera pendiente, y compararlo con el saldo contable.

Los clientes que salgan en la vista es que alguna cosa no cuadra entre contabilidad y cartera.

SELECT CLIENTES.IDORG, CLIENTES.CODCLI, CLIENTES.NOMCLI, CLIENTES.CUENTA,
ANTICIPOS.ANTICIPO,
CARTERA.PENDIENTE,
DIARIO.SALDO,
(DIARIO.Saldo – COALESCE (CARTERA.Pendiente, 0) + COALESCE (ANTICIPOS.Anticipo, 0)) AS DIFERENCIA

FROM CLIENTES WITH (NOLOCK)

LEFT OUTER JOIN (SELECT CODCLI, SUM(IMPORTE – IMPACUENTA) AS Anticipo FROM CARTERA WHERE (COBPAG = ‘C’) AND (ANTICIPO = ‘A’) GROUP BY CODCLI) AS ANTICIPOS ON ANTICIPOS.CODCLI=CLIENTES.CODCLI

LEFT OUTER JOIN (SELECT CODCLI, SUM(IMPORTE) AS Pendiente FROM CARTERA WHERE (COBPAG = ‘C’) AND (PAGADO = ‘F’) GROUP BY CODCLI) AS CARTERA ON CARTERA.CODCLI=CLIENTES.CODCLI

LEFT OUTER JOIN (SELECT APUNTES.CUENTA, SUM(APUNTES.DEBE – APUNTES.HABER) AS Saldo FROM APUNTES GROUP BY APUNTES.CUENTA) AS DIARIO ON DIARIO.CUENTA=CLIENTES.CUENTA

WHERE ( [DevolverRegistros, SysName, 1 = 1])
AND ( [CondicionTabla, SysName, 1 = 1])
AND ( [Filtro, SysName, 1 = 1])
AND ( ( ‘[TextoBusqueda, SysName, ”]’ = ”) OR
( CLIENTES.CODCLI LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CLIENTES.NOMCLI LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CLIENTES.TELCLI LIKE ‘%[TextoBusqueda, SysName, ”]%’))
AND (DIARIO.Saldo – COALESCE (CARTERA.Pendiente, 0) + COALESCE (ANTICIPOS.Anticipo, 0) <> 0)

ORDER BY CLIENTES.CODCLI, CLIENTES.NOMCLI, CLIENTES.TELCLI

Usa sub consultas para obtener

Antipos no consumidos:
LEFT OUTER JOIN (SELECT CODCLI, SUM(IMPORTE – IMPACUENTA) AS Anticipo FROM CARTERA WHERE (COBPAG = ‘C’) AND (ANTICIPO = ‘A’) GROUP BY CODCLI) AS ANTICIPOS ON ANTICIPOS.CODCLI=CLIENTES.CODCLI

Cartera cobros pendiente:
LEFT OUTER JOIN (SELECT CODCLI, SUM(IMPORTE) AS Pendiente FROM CARTERA WHERE (COBPAG = ‘C’) AND (PAGADO = ‘F’) GROUP BY CODCLI) AS CARTERA ON CARTERA.CODCLI=CLIENTES.CODCLI

Saldo contable:
LEFT OUTER JOIN (SELECT APUNTES.CUENTA, SUM(APUNTES.DEBE – APUNTES.HABER) AS Saldo FROM APUNTES GROUP BY APUNTES.CUENTA) AS DIARIO ON DIARIO.CUENTA=CLIENTES.CUENTA

Pedidos ventas pendientes, con importe pendiente

Esta vista SQL muestra los pedidos ventas pendientes de servir, con las unidades pendientes y el importe pendiente.

SELECT LINEAS.SITUACION, CABEPEDV.IDPEDV, CABEPEDV.TIPOCONT, CABEPEDV.SERIE, CABEPEDV.NUMDOC, CABEPEDV.FECHA, CABEPEDV.REFERENCIA, CABEPEDV.CODCLI, CABEPEDV.NOMCLI,
Lineas.FecEntrega Fecha_Entrega, Lineas.CodArt Articulo, Lineas.DescLin Descripcion, Lineas.Unidades,
Lineas.uniservida as Servidas, Lineas.unianulada as Anuladas, Lineas.Unidades-Lineas.UniServida-Lineas.UniAnulada as Pendientes,
DATEDIFF( dd, Lineas.FecEntrega, GetDate()) as Dias,
Lineas.BaseMoneda/Lineas.Unidades*(Lineas.Unidades-Lineas.UniServida-Lineas.UniAnulada) as Importe

FROM CABEPEDV WITH (NOLOCK)
LEFT OUTER JOIN LinePedi Lineas WITH(NOLOCK) ON Lineas.IdPedV = CabePedV.IdPedV
LEFT OUTER JOIN Articulo WITH(NOLOCK) ON Articulo.CodArt = Lineas.CodArt
LEFT OUTER JOIN Clientes WITH(NOLOCK) ON Clientes.CodCli = CabePedV.CodCli

WHERE ( [DevolverRegistros, SysName, 1 = 1])
AND LINEAS.SITUACION=’A’ AND LINEAS.UNIDADES<>0
AND ( [CondicionTabla, SysName, 1 = 1])
AND ( [Filtro, SysName, 1 = 1])
AND ( [CondicionIdentificadores, SysName, 1 = 1])
AND ( [CondicionCodigo, SysName, 1 = 1])
AND ( [CondicionRepresentante, Sysname, 1 = 1])
AND ( [CondicionFechasDocumento, SysName, 1 = 1])
AND ( [CondicionNumeroDocumento, Sysname, 1 = 1])
AND ( [CondicionReferenciaDocumento, Sysname, 1 = 1])
AND ( [CondicionSituacionDocumento, Sysname, 1 = 1])
AND ( ( ‘[TextoBusqueda, SysName, ”]’ = ”) OR
( CABEPEDV.SITUACION LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CABEPEDV.IDPEDV LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CABEPEDV.TIPOCONT LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CABEPEDV.SERIE LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CABEPEDV.NUMDOC LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CABEPEDV.FECHA LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CABEPEDV.REFERENCIA LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CABEPEDV.CODCLI LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( CABEPEDV.NOMCLI LIKE ‘%[TextoBusqueda, SysName, ”]%’))
ORDER BY CABEPEDV.TIPOCONT, CABEPEDV.SERIE, CABEPEDV.NUMDOC, CABEPEDV.FECHA, CABEPEDV.REFERENCIA, CABEPEDV.CODCLI, CABEPEDV.NOMCLI

Observe el uso de la funcion DATTEDIF para calcular los dias que faltan hasta la fecha de entrega respecto a la fecha del sistema:
DATEDIFF( dd, Lineas.FecEntrega, GetDate()) as Dias,

Y el calculo del importe pendiente a partir del precio neto unitario (base / unidades) * unidades pendientes.
Lineas.BaseMoneda/Lineas.Unidades*(Lineas.Unidades-Lineas.UniServida-Lineas.UniAnulada) as Importe

Hemos añadido tambien un criterio fijo: lineas Activas (no servidas) y con unidades distintas de 0.
AND LINEAS.SITUACION=’A’ AND LINEAS.UNIDADES<>0

Stock de varios almacenes

Con esta vista SQL podemos ver que tiene cada articulo en distintos almacenes en forma de columna.

SELECT ARTICULO.CODART, ARTICULO.DESCART,
STO1.UNIDADES ALM1,
STO2.UNIDADES ALM2


FROM ARTICULO WITH (NOLOCK)
LEFT JOIN __STOCKALMART STO1 ON STO1.CODART=ARTICULO.CODART AND LTRIM(STO1.CODALM)=’1′
LEFT JOIN __STOCKALMART STO2 ON STO2.CODART=ARTICULO.CODART AND LTRIM(STO2.CODALM)=’2′

WHERE ( [DevolverRegistros, SysName, 1 = 1])
AND ( [CondicionTabla, SysName, 1 = 1])
AND ( [Filtro, SysName, 1 = 1])
AND ( ( ‘[TextoBusqueda, SysName, ”]’ = ”) OR
( ARTICULO.CODART LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( ARTICULO.DESCART LIKE ‘%[TextoBusqueda, SysName, ”]%’))
ORDER BY ARTICULO.CODART, ARTICULO.DESCART

Precios de compra a distintos proveedores

Esta vista muestra los distintos precios de compra de un articulo, con su proveedor, los descuentos que son aplicables y el precio neto. En cuanto a descuentos solo se tiene en cuenta la combinacion articulo / proveedor, si aplicar unidades o fechas

SELECT ARTICULO.CODART, ARTICULO.DESCART,
ARTICULO.CODPRO PREFERENTE,
PRCESP.CODPRO,
PROVEED.NOMPRO,
PRCESP.PRECIO,
COALESCE(DESCUENT.DESC1,0) DTO1,
COALESCE(DESCUENT.DESC2,0) DTO2,
COALESCE(DESCUENT.DESC3,0) DTO3,
round(((PRCESP.PRECIO((100-COALESCE(DESCUENT.DESC1,0))/100))((100-COALESCE(DESCUENT.DESC2,0))/100))*((100-COALESCE(DESCUENT.DESC3,0))/100),2) PrecioNeto

FROM ARTICULO WITH (NOLOCK)
LEFT JOIN PRCESP ON PRCESP.CODART=ARTICULO.CODART
LEFT JOIN PROVEED ON PROVEED.CODPRO=PRCESP.CODPRO
LEFT JOIN DESCUENT ON DESCUENT.CODPRO=PRCESP.CODPRO AND DESCUENT.CODART=PRCESP.CODART
WHERE ( [DevolverRegistros, SysName, 1 = 1])
AND ( [CondicionTabla, SysName, 1 = 1])
AND ( [Filtro, SysName, 1 = 1])
AND ( ( ‘[TextoBusqueda, SysName, ”]’ = ”) OR
( ARTICULO.CODART LIKE ‘%[TextoBusqueda, SysName, ”]%’) OR
( ARTICULO.DESCART LIKE ‘%[TextoBusqueda, SysName, ”]%’))
ORDER BY ARTICULO.CODART, ARTICULO.DESCART



Facturas ventas datos bancarios

Modificar el pie del documento para que Si el documento de pago es TR, se imprima el IBAN y el CCC del banco de de la empresa, y e otro caso el IBAN y CCC del cliente

Para ello necesitamos tener los datos de nuestro banco, que podemos obtener de la tabla bancos. Modificamos la SQL del documento añadiendo

   ,BANCOS.IBANEXT+' '+BANCOS.CUENTAEXT AS CUENTABANCO

y vinculamos la tabla BANCOS con
   LEFT OUTER JOIN BANCOS
      ON BANCOS.CODBAN=CLIENTES.CODBAN

ATENCION, podemos usar el campo CODBAN de la tabla clientes, o en el caso de facturas el de la CABECERA

Recomiendo tambien tener la domiciliacion bancaria del cliente en este formato
       ,DomBanca.IBANEXT+' '+DomBanca.CUENTAEXT AS CUENTACLIENTE

Y asegurarnos que tenemos disponible el campo del documento de pago
       ,DocuPago.DescDoc

Luego en el diseño añadimos una expresion conIF(DOCPAG=’TR’,CUENTABANCO,CUENTACLIENTE)

Verificar

Con un cliente con documento de pago TR: salen los datos del banco de cabecera?

Con un cliente con documento de pago R y domiciliación en su ficha: salen los datos de domiciliación del cliente?

Documentos de ventas pronto pago

Para añadir el pronto pago en los documentos de ventas debemos añadir a la SQL del documento:

,CABECERA.PORPRONTO
,CABECERA.TOTPRONTO

Y luego en el diseño del documento una etiqueta para el titulo y el %, que en realidad es una expresion, pues queremos que solo salga si hay pronto pago, con:

if(PORPRONTO=0,”,’Dto.p.p’+PORPRONTO+’%’)

Y debajo otra expresion para el importe del pronto pago, con:

IF(PORPRONTO=0,”,TOTPRONTO)

Vista SQL para Facturas ventas con lineas de A3ERP

SELECT dbo.CABEFACV.IDFACV, dbo.CABEFACV.SERIE AS Serie, dbo.CABEFACV.NUMDOC AS Numero, dbo.CABEFACV.FECHA AS Fecha, dbo.CABEFACV.CODCLI AS Cliente, dbo.CABEFACV.NOMCLI AS [Cliente nombre],
dbo.LINEFACT.CODART AS Articulo, dbo.ARTICULO.DESCART AS [Articulo descripcion], dbo.LINEFACT.UNIDADES AS Unidades, dbo.LINEFACT.PRECIO AS Precio, dbo.LINEFACT.BASEMONEDA AS Importe,
dbo.LINEFACT.PRCMEDIO AS [Precio coste], dbo.PROVINCI.NOMPROVI AS Provincia, dbo.PAISES.NOMPAIS AS Pais, dbo.REPRESEN.NOMREP AS [Representante nombre], dbo.LINEFACT.CODREP AS Representante,
dbo.ARTICULO.CAR1 AS Familia, dbo.Caracter_Art_1.DESCCAR AS [Familia descripcion], dbo.CABEFACV.POBCLI AS Poblacion
FROM dbo.CABEFACV LEFT OUTER JOIN
dbo.PAISES ON dbo.PAISES.CODPAIS = dbo.CABEFACV.CODPAIS LEFT OUTER JOIN
dbo.PROVINCI ON dbo.CABEFACV.CODPROVI = dbo.PROVINCI.CODPROVI LEFT OUTER JOIN
dbo.LINEFACT ON dbo.LINEFACT.IDFACV = dbo.CABEFACV.IDFACV LEFT OUTER JOIN
dbo.REPRESEN ON dbo.REPRESEN.CODREP = dbo.LINEFACT.CODREP LEFT OUTER JOIN
dbo.ARTICULO ON dbo.ARTICULO.CODART = dbo.LINEFACT.CODART LEFT OUTER JOIN
dbo.Caracter_Art_1 ON dbo.ARTICULO.CAR1 = dbo.Caracter_Art_1.CODCAR

Vincular tablas de A3

Los programas de Asoft se conectan con A3 y usan sus tablas para gestionar la información. Pero para ello debemos indicar que tablas queremos vincular.

Hacemos doble clic en el menú principal, en la parte inferior izquierda donde están las cadenas de conexión

Se muestra la pantalla de A3ERP Conexión

Seleccionar las Tablas A3ERP a vincular

Con el botón

Se muestran las tablas de A3 y podemos ir marcando las que quedamos Vincular

Es importante también indicar el campo que debe ser clave principal

Ejecutar la vinculación

Con el botón

Se ejecuta el procedimiento que vincula tala tablas seleccionadas

Si hemos indicado el índice, se mostrara un mensaje indicándolo.

En la parte de la derecha vemos las tablas vinculadas

Re vincular

Si alguna nos da problemas o queremos re vincularla basta con hacer doble clic sobre ella.

Añadir una tabla a vincular

Si ya hemos vinculado las tablas y solo queremos añadir alguna basta con entrar en Tablas a3ERP a vincular, seleccionarla, cerrar la tabla y hacer clic en la lista de tablas.

Que se refresca y nos mostrara la que hemos añadido

Ahora hacemos doble clic y se re vincula solo esta.