4 using System.Collections.Generic;
18 #region Variables privadas 23 private bool _usarDatosHisserie =
true;
25 #region Tablas temporales 27 private const string TEMPCOMPRAS =
@"#TMPCOMPRAS";
28 private const string TEMPSTOCKINI =
@"#TMPSTOCKINI";
29 private const string TEMPINICIALSER =
@"#TMPINICIALSER";
30 private const string TEMPTRASP =
@"#TMPTRASP";
32 #endregion Tablas temporales 34 #endregion Variables privadas 41 public string EjercicioAnterior
50 public string Ejercicio
52 get {
return _Actual.Ejercicio; }
59 public string Mensaje {
get;
private set; } =
string.Empty;
64 public bool Restultado {
get;
private set; } =
false;
66 #endregion Propiedades 85 #endregion Constructores 87 #region Métodos públicos 95 if (!ValidacionesPrevias())
98 var query =
string.Empty;
101 query += GetQuery_BorrarTablasTemporales();
104 query += GetQuery_BorrarArticulosDeSeriesDeStockIni();
107 query += GetQuery_BorrarArticulosDeSeriesDeInicialser();
110 query += GetQuery_CrearOrigenesDeDatos();
113 query += GetQuery_InsertarRegistros();
116 query += GetQuery_BorrarTablasTemporales();
119 Restultado = DB.SQLExec(query);
122 #endregion Métodos públicos 124 #region Métodos privados 129 private string GetQuery_BorrarTablasTemporales()
131 var query =
string.Empty;
133 query += $
"IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE ID = OBJECT_ID(N'tempdb..{TEMPCOMPRAS}')) BEGIN DROP TABLE {TEMPCOMPRAS} END; " + Environment.NewLine;
134 query += $
"IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE ID = OBJECT_ID(N'tempdb..{TEMPSTOCKINI}')) BEGIN DROP TABLE {TEMPSTOCKINI} END; " + Environment.NewLine;
135 query += $
"IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE ID = OBJECT_ID(N'tempdb..{TEMPINICIALSER}')) BEGIN DROP TABLE {TEMPINICIALSER} END; " + Environment.NewLine;
136 query += $
"IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE ID = OBJECT_ID(N'tempdb..{TEMPTRASP}')) BEGIN DROP TABLE {TEMPTRASP} END; " + Environment.NewLine;
141 private bool ValidacionesPrevias()
148 Mensaje =
"No existe ejercicio anterior.";
153 if (!InstalacionConSeries())
156 Mensaje =
"La instalación no trabaja con series.";
163 private bool InstalacionConSeries()
167 var sql = $
"SELECT TOP (1) * FROM {DB.SQLDatabase(_Actual.Ejercicio, "CONTADOR
")} WHERE SERIES = 8758 OR SERIES = 8578 ";
168 var datos =
new DataTable();
169 if (DB.SQLExec(sql, ref datos) && datos.Rows.Count > 0)
176 private string GetQuery_InsertarRegistros()
178 var query =
string.Empty;
181 query += $
"INSERT INTO {DB.SQLDatabase(_Actual.Ejercicio, "STOCKINI
")} (EMPRESA, ALMACEN, FECHA, ARTICULO, UNIDADES, LINIA, PMCOM, DEPCOM) " + Environment.NewLine +
182 $
"(" + Environment.NewLine +
183 $
" SELECT STOCKINI.EMPRESA, STOCKINI.ALMACEN, {DB.SQLString(_Actual.PeriodoIni)} as FECHA, STOCKINI.ARTICULO, STOCKINI.SERIES as UNIDADES, " + Environment.NewLine +
184 " (SELECT STR(COALESCE(MAX(NUMLINEA.LINIA) + STOCKINI.NUMLIN, STOCKINI.NUMLIN), 5) AS NUMERO " + Environment.NewLine +
185 $
" FROM {DB.SQLDatabase(_Actual.Ejercicio, "STOCKINI
")} NUMLINEA " + Environment.NewLine +
186 " WHERE NUMLINEA.EMPRESA = STOCKINI.EMPRESA " + Environment.NewLine +
187 " AND NUMLINEA.ALMACEN = STOCKINI.ALMACEN " + Environment.NewLine +
188 $
" AND NUMLINEA.FECHA = {DB.SQLString(_Actual.PeriodoIni)} " + Environment.NewLine +
189 " ) as LINIA, STOCKINI.COSTE AS PMCOM, STOCKINI.DEPOSITO AS DEPCOM " + Environment.NewLine +
190 $
" FROM {TEMPSTOCKINI} as STOCKINI" + Environment.NewLine +
191 $
"); " + Environment.NewLine;
194 query += $
"SELECT STOCKINI.EMPRESA, STOCKINI.ALMACEN, STOCKINI.FECHA, STOCKINI.LINIA as LINEA, STOCKINI.ARTICULO, COMPRAS.SERIE, " + Environment.NewLine +
195 $
" COMPRAS.LINEA as NUMERO, Cast(0 as bit) as BAJA, Cast(0 as bit) as MODELO, " + Environment.NewLine +
196 $
" (CASE COMPRAS.DEPOSITO WHEN 'D' THEN Cast(1 as bit) ELSE Cast(0 as bit) END) as DEPOSITO " + Environment.NewLine +
197 $
"INTO {TEMPINICIALSER} " + Environment.NewLine +
198 $
"FROM (" + Environment.NewLine +
199 $
" SELECT STOCKINI.EMPRESA, STOCKINI.ALMACEN, STOCKINI.FECHA, STOCKINI.ARTICULO, STOCKINI.LINIA " + Environment.NewLine +
200 $
" FROM {DB.SQLDatabase(_Actual.Ejercicio, "STOCKINI
")} " + Environment.NewLine +
201 $
" INNER JOIN({GetQuery_ArticulosDeSeries(_Anterior.Ejercicio)}) ARTICULO ON STOCKINI.ARTICULO = ARTICULO.ARTICULO " + Environment.NewLine +
202 $
" ) STOCKINI " + Environment.NewLine +
203 $
"LEFT JOIN( " + Environment.NewLine +
204 $
" SELECT ARTICULO, ALMACEN, SERIE, DEPOSITO, ROW_NUMBER() OVER(PARTITION BY EMPRESA, ALMACEN, ARTICULO order by EMPRESA, ALMACEN, ARTICULO) as LINEA " + Environment.NewLine +
205 $
" FROM {TEMPCOMPRAS} " + Environment.NewLine +
206 $
" ) COMPRAS ON COMPRAS.ARTICULO = STOCKINI.ARTICULO AND COMPRAS.ALMACEN = STOCKINI.ALMACEN ; " + Environment.NewLine;
209 query += $
"INSERT {DB.SQLDatabase(_Actual.Ejercicio, "INICIALSER
")} (EMPRESA, ALMACEN, FECHA, LINEA, ARTICULO, SERIE, NUMERO, BAJA, MODELO, DEPOSITO) " + Environment.NewLine +
210 $
" (SELECT EMPRESA, ALMACEN, FECHA, LINEA, ARTICULO, SERIE, NUMERO, BAJA, MODELO, DEPOSITO FROM {TEMPINICIALSER}) ;" + Environment.NewLine;
213 query += $
"INSERT INTO {DB.SQLDatabase("COMUNES
", "HISSERIE
")} " +
214 "(SERIE,FECHA,HORA,DOCUMENTO,NUMERO,CUENTA,MOVIMIENTO,USUARIO,COSTE,PRECIO,OBSERVA,ORDENADOR,EMPRESA,ALMACEN,MODELO, IGNORAR, FECHADOC) " + Environment.NewLine +
216 DB.SQLString(DateTime.Now.ToString(
"d")) +
", " +
217 DB.SQLString(DateTime.Now.ToString(
"T")) +
", " +
222 "'ACTUALIZACION', " +
226 DB.SQLString(Environment.MachineName.Trim().ToUpper()) +
", " +
230 " CAST(0 as BIT), " +
232 $
"FROM {TEMPINICIALSER} ) ;" + Environment.NewLine;
242 private string GetQuery_CrearOrigenesDeDatos()
244 #region Datos STOCKINSER 247 string queryOrigenDatos = GetQuery_ObtenerSeriesDeStockInSer();
250 queryOrigenDatos = $
@"SELECT DATOS.* " + Environment.NewLine +
251 $
"INTO {TEMPCOMPRAS} " + Environment.NewLine +
252 $
"FROM ({queryOrigenDatos}) AS DATOS; " + Environment.NewLine;
254 #region Corrección eventuales cambios de almacen 257 queryOrigenDatos += QueryCrearTablaTemporal_TraspasosAlmacen() +
"; ";
260 queryOrigenDatos += $
"UPDATE A set A.ALMACEN = B.ALMACEN " + Environment.NewLine +
261 $
"FROM {TEMPCOMPRAS} AS A," + Environment.NewLine +
262 $
"(" + Environment.NewLine +
263 $
" SELECT x.SERIE, x.ALMACEN FROM {TEMPTRASP} x " + Environment.NewLine +
264 $
") AS B" + Environment.NewLine +
265 $
"WHERE A.SERIE = B.SERIE; " + Environment.NewLine;
268 #endregion Corrección eventuales cambios de almacen 270 #endregion Datos COMPRAS e STOCKINSER 272 #region Datos para STOCKINI 274 queryOrigenDatos +=
"SELECT EMPRESA, ALMACEN, ARTICULO, COUNT(*) AS SERIES, " + Environment.NewLine +
275 " ROUND(SUM(COSTE)/COUNT(*),2) AS COSTE, " + Environment.NewLine +
276 " SUM(CASE DEPOSITO WHEN 'D' THEN 1 ELSE 0 END) AS DEPOSITO, " + Environment.NewLine +
277 " ROW_NUMBER() OVER(PARTITION BY EMPRESA, ALMACEN order by EMPRESA, ALMACEN, ARTICULO) as NUMLIN " + Environment.NewLine +
278 $
"INTO {TEMPSTOCKINI} FROM {TEMPCOMPRAS} " + Environment.NewLine +
279 "GROUP BY EMPRESA, ALMACEN, ARTICULO ; " + Environment.NewLine + Environment.NewLine;
281 #endregion Datos para STOCKINI 283 return queryOrigenDatos;
286 private string QueryCrearTablaTemporal_TraspasosAlmacen()
290 var query =
"SELECT DATOS.* " +
291 $
"INTO {TEMPTRASP} " +
292 "FROM (" + Environment.NewLine +
293 "SELECT SERIE.SERIE, SERIE.ARTICULO, DOCUMENTO.FECHA, DOCUMENTO.ALMORIG AS ALMACEN, DOCUMENTO.ALMDEST, 'TRASPASO' as TIPOMOV, " + Environment.NewLine +
294 CamposHisserie() +
", ROW_NUMBER() OVER(PARTITION BY SERIE.SERIE ORDER BY DOCUMENTO.Fecha ASC ) AS fila" + Environment.NewLine +
295 $
"FROM {DB.SQLDatabase(_Actual.Ejercicio, "TRASPSER
")} SERIE " + Environment.NewLine +
296 $
"INNER JOIN {DB.SQLDatabase(_Actual.Ejercicio, "C_ALBATR
")} DOCUMENTO ON DOCUMENTO.EMPRESA = SERIE.EMPRESA " +
297 "AND DOCUMENTO.NUMERO = SERIE.ALBARAN " + Environment.NewLine +
298 $
"INNER JOIN {DB.SQLDatabase(_Actual.Ejercicio, "D_ALBATR
")} DETALLE ON DETALLE.EMPRESA = SERIE.EMPRESA " +
299 "AND DETALLE.NUMERO = SERIE.ALBARAN " +
300 "AND DETALLE.LINIA = SERIE.LINEA " +
301 "AND DETALLE.ARTICULO = SERIE.ARTICULO " + Environment.NewLine +
302 LeftJoinHisserie(documento:
"TRASPASO") +
" " + Environment.NewLine +
303 ") DATOS WHERE DATOS.FILA = 1 " + Environment.NewLine;
308 #region Métodos comunes de HISSERIE 310 private string CamposHisserie()
313 if (_usarDatosHisserie)
315 campos =
"HISSERIE.FECHAMOV, HISSERIE.MOVIMIENTO " + Environment.NewLine;
322 private string LeftJoinHisserie(
string documento)
325 if (_usarDatosHisserie)
327 var tipoMovimiento =
"(MOVIMIENTO = 'A' OR MOVIMIENTO = 'B')";
328 var joinClause =
"SERIE.SERIE = HISSERIE.SERIE ";
332 joinClause +=
" AND RTRIM(SERIE.ALBARAN) +LTRIM(RTRIM(SERIE.LETRA)) = RTRIM(HISSERIE.NUMERO) ";
335 joinClause +=
" AND RTRIM(SERIE.DEPOSITO) +LTRIM(RTRIM(SERIE.LETRA)) = RTRIM(HISSERIE.NUMERO) ";
340 joinClause +=
" AND RTRIM(SERIE.DOCUMENTO) = RTRIM(HISSERIE.NUMERO) ";
349 joinClause +=
" AND RTRIM(SERIE.ALBARAN) = RTRIM(HISSERIE.NUMERO) ";
353 tipoMovimiento =
"MOVIMIENTO = 'M' ";
354 joinClause +=
" AND RTRIM(SERIE.ALBARAN) = RTRIM(HISSERIE.NUMERO) ";
358 joinClause +=
" AND RTRIM(SERIE.SERVEI) = RTRIM(HISSERIE.NUMERO) ";
362 joinClause +=
" AND RTRIM(SERIE.ORDRE) = RTRIM(HISSERIE.NUMERO) ";
366 joinClause +=
" AND HISSERIE.CUENTA = '' AND HISSERIE.NUMERO = '' ";
370 joinClause +=
" AND RTRIM(SERIE.ALBARAN) = RTRIM(HISSERIE.NUMERO) AND SERIE.PROVEEDOR = HISSERIE.CUENTA ";
374 joinClause +=
" AND RTRIM(SERIE.EMPRESA) = RTRIM(HISSERIE.DOCUMENTO) ";
381 query =
"LEFT JOIN ( " + Environment.NewLine +
382 " SELECT SERIE, MAX(FECHA +HORA) AS FECHAMOV, NUMERO, MAX(MOVIMIENTO) AS MOVIMIENTO, MAX(DOCUMENTO) AS DOCUMENTO, MAX(CUENTA) AS CUENTA " + Environment.NewLine +
383 $
" FROM { DB.SQLDatabase("COMUNES
", "HISSERIE
")} " + Environment.NewLine +
384 $
" WHERE DOCUMENTO = '{documento}' AND {tipoMovimiento} AND IGNORAR = 0 " + Environment.NewLine +
385 " GROUP BY SERIE, NUMERO, FECHA " + Environment.NewLine +
386 ") HISSERIE ON " + joinClause;
391 #endregion Métodos comunes de HISSERIE 397 private string GetQuery_ObtenerSeriesDeStockInSer()
399 return $
"SELECT COMPRAS.CODEMPCOM AS EMPRESA, COMPRAS.ALMACEN, STOCKINSER.SERIE, STOCKINSER.ARTICULO, ARTICULO.NOMBRE, COMPRAS.COSTE, COMPRAS.DEPOSITO, " + Environment.NewLine +
400 $
" COMPRAS.GARANTIA, COMPRAS.BAJA, COMPRAS.FECHA, COMPRAS.CODEMPCOM, COMPRAS.EMPRESA as CAMPOEMPRESA " + Environment.NewLine +
401 $
"FROM ({GetQuery_StockInser(_Actual.Ejercicio)}) STOCKINSER " + Environment.NewLine +
402 $
"INNER JOIN " + DB.SQLDatabase(
"COMUNES",
"COMPRAS") +
" COMPRAS on STOCKINSER.SERIE = COMPRAS.SERIE " + Environment.NewLine +
403 $
"INNER JOIN ({GetQuery_ArticulosDeSeries(_Anterior.Ejercicio)}) AS ARTICULO ON ARTICULO.ARTICULO = COMPRAS.ARTICULO " + Environment.NewLine +
404 $
"WHERE (COMPRAS.BAJA = '' OR (COMPRAS.BAJA = 'S' AND COMPRAS.FBAJA >= {DB.SQLString(_Actual.PeriodoIni)} )) " + Environment.NewLine;
412 private string GetQuery_ArticulosDeSeries(
string ejercicio)
414 string lcSql = $
"SELECT CODIGO AS ARTICULO, NOMBRE FROM {DB.SQLDatabase(ejercicio, "ARTICULO
")} WHERE VENSERIE = 1 AND MODELO = '' ";
423 private string GetQuery_StockInser(
string ejercicio)
425 string lcSql = $
"SELECT ARTICULO, SERIE, ALMACEN FROM {DB.SQLDatabase(ejercicio, "STOCKINSER
")} ";
433 private string GetQuery_BorrarArticulosDeSeriesDeStockIni()
435 var query = $
"DELETE FROM {DB.SQLDatabase(_Actual.Ejercicio, "STOCKINI
")} " +
436 $
"WHERE ARTICULO IN(SELECT CODIGO AS ARTICULO FROM {DB.SQLDatabase(_Anterior.Ejercicio, "ARTICULO
")} WHERE VENSERIE = 1 AND MODELO = ''); " + Environment.NewLine;
445 private string GetQuery_BorrarArticulosDeSeriesDeInicialser()
447 var query = $
"DELETE FROM {DB.SQLDatabase(_Actual.Ejercicio, "INICIALSER
")}; " + Environment.NewLine;
452 #endregion Métodos privados PeriodoItem GetPeriodoAnteriorAl(string tcEjercicio)
Obtiene el período anterior del ejercicio pasado como parámetro
void Execute()
Ejecuta el proceso
PeriodoItem GetPeriodo(string tcEjercicio)
Obtiene el período correspondiente al ejercicio pasado como parámetro
string Ejercicio
Ejercicio
Clase para la generación de registros en STOCKINI e INICIALSER en procesos de migración EW => s50 Se ...
DateTime PeriodoIni
Fecha de inicio de período
static Periodos Instancia
Instancia SINGLETON para períodos
Clase SINGLETON para la gestión de períodos
bool ExisteEjercicioAnteriorAl(string tcEjercicio)
Método que determina si existe el ejercicio anterior al indicado
StockInicialProcesoMigracion(string ejercicio)
Constructor con parámetros
string Ejercicio
Ejercicio sobre el que se realiza la operación