GrupoempTools.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Data;
7 using System.Data.Sql;
8 using System.Data.SqlClient;
9 using System.IO;
10 using System.Xml;
11 using System.Data.Odbc;
12 using System.ComponentModel;
13 using System.Text.RegularExpressions;
14 
15 namespace sage.ew.db
16 {
20  public static class GrupoempTools
21  {
22  #region PROPIEDADES PUBLICAS
23 
27  public static string _Euroserv = "";
28 
32  public static int _LenCuenta = 8;
33 
37  public static int _LenMarca = 2;
38 
42  public static int _LenFamilia = 2;
43 
47  public static int _LenVendedor = 2;
48 
52  public static int _LenAlmacen = 2; // Bug 109147
53 
57  public static string _PrefijoDeudor3 = "440";
58 
62  public static string _PrefijoCli3 = "430";
63 
67  public static string _PrefijoPro3 = "400";
68 
72  public static string _PrefijoAcr3 = "410";
73 
77  public static string _PrefijoBan3 = "572";
78 
79 
83  public static string _PrefijoCaj3 = "570";
84 
88  public static string _PrefijoCom3 = "600";
89 
93  public static string _PrefijoVen3 = "700";
94 
98  public static string _Error_Message = "";
99 
103  public static bool _Log = true;
104 
108  public static string _RutaFicheroLog = "";
109 
113  public static string _GrupoPrincipal = "";
114 
118  public static string _GrupoOrigen = "";
119 
123  public static string _DbComunesGrOrigen = "";
124 
128  public static string _DbEjerGrOrigen = "";
129 
133  public static DataTable _dtBdAddonsGrOrigen = new DataTable();
134 
138  public static string _CarpetaBackupServidorSql = "";
139 
143  public static string _DbComunesGrNuevo = "";
144 
148  public static string _DbEjerGrNuevo = "";
149 
153  public static DataTable _dtBdAddonsGrNuevo = new DataTable();
154 
158  public static string _UserPropBdGrNuevo = "Sage50";
159 
163  public static string _EmpresaGrNuevo = "";
164 
168  public static string _NombreEmpresa = "";
169 
173  public static string _CifEmpresa = "";
174 
175 
179  public static bool _CfgEjerPartiGrNuevo = false;
180 
184  public static string _EjerOrigen = "";
185 
189  public static string _EjerNuevo= "";
190 
191 
196  public static bool _EjerNuevoMarcarPredet = false;
197 
201  public static DateTime? _FechaIniEjerOrigen = null;
202 
206  public static DateTime? _FechaFinEjerOrigen = null;
207 
208 
212  public static DateTime? _FechaIniEjerNuevo = null;
213 
217  public static DateTime? _FechaFinEjerNuevo = null;
218 
222  public static string _SufiBdEjerGrNuevo = "";
223 
224 
228  public static bool _ConservarClientes = false;
229 
233  public static bool _LongitudesEstandar = false;
234 
235 
239  public static bool _ConservarUsuarios = false;
240 
244  public static string _DbComunesGrBorrar = "";
245 
249  public static DataTable _dtBdEjerGrBorrar = new DataTable();
250 
254  public static DataTable _dtBdAddonsGrBorrar = new DataTable();
255 
256 
257 
258  // PROPIEDADES PROPIAS DE LA CREACION DE NUEVO EJERCICIO A PARTIR DE OTRO EJERCICIO
259 
260 
264  public static bool _ConservarArticulos = false;
265 
266 
270  public static bool _ConservarProveedores = false;
271 
275  public enum TipoOperativaCreacion
276  {
280  PorCopiaRestauracionBd,
281 
285  PorTablas
286  };
287 
291  public static TipoOperativaCreacion _TipoOperativaCreacionGrupoEjer = TipoOperativaCreacion.PorCopiaRestauracionBd;
292 
297  public static BackgroundWorker _Worker = null;
298 
302  public static int _TotalPasosProgreso = 0;
303 
307  public static int _PasoProgreso = 0;
308 
312  public static string _CrearGrupoP = "";
313 
314  #endregion PROPIEDADES PUBLICAS
315 
316  #region PROPIEDADES PRIVADAS
317 
318  private static string[,] _CuentasCd = new string[,] {
319  { "12900001","PÉRDIDAS Y GANANCIAS","N","","",""} ,
320  { "30000001","EXISTENCIAS DE MERCADERÍAS","N","","",""} ,
321  { "40000001","PROVEEDOR","N","","",""} ,
322  { "40600001","ENVASES A DEVOLVER A PROVEEDORES","N","","",""} ,
323  { "40700001","ANTICIPOS A PROVEEDORES","N","","",""} ,
324  { "41000001","ACREEDOR","N","","",""} ,
325  { "41400000","VALES","N","","",""},
326  { "43000001","CLIENTE CONTADO","","","",""} ,
327  { "43600001","CLIENTES DE DUDOSO COBRO","","","",""} ,
328  { "43700001","ENVASES A DEVOLVER POR CLIENTES","","000","",""} ,
329  { "43800001","ANTICIPOS CLIENTES","","000","",""} ,
330  { "44000001","DEUDOR","N","","",""} ,
331  { "46000000","ANTICIPOS DE REMUNERACIONES","N","","",""} ,
332  { "46500001","REMUNERACIONES PENDIENTES DE PAGO","N","","",""} ,
333  { "47000001","HACIENDA PÚBLICA DEUDORA POR CONCEPTOS FISCALES","N","","",""} ,
334  { "47200000","IVA SOPORTADO 0%","N","","",""} ,
335  { "47200001","IVA SOPORTADO","N","","",""} ,
336  { "47200002","RECARGO SOPORTADO","N","","",""} ,
337  { "47200004","IVA SOPORTADO 4%","N","","",""} ,
338  { "47200010","IVA SOPORTADO 10%","N","","",""} ,
339  { "47200011","IVA SOPORTADO 4% CEE","N","","",""} ,
340  { "47200012","IVA SOPORTADO 10% CEE","N","","",""} ,
341  { "47200013","IVA SOPORTADO 21% CEE","","000","",""} ,
342  { "47200020","RECARGO SOPORTADO 0%","N","","",""} ,
343  { "47200021","IVA SOPORTADO 21%","N","","",""} ,
344  { "47200024","RECARGO SOPORTADO 0.5%","N","","",""} ,
345  { "47200026","RECARGO SOPORTADO 5.2%","N","","",""} ,
346  { "47200027","RECARGO SOPORTADO 1.4%","N","","",""} ,
347  { "47200098","RECARGO SOPORTADO CRITERIO DE CAJA","N","","",""} ,
348  { "47200099","IVA SOPORTADO CRITERIO DE CAJA","N","","",""} ,
349  { "47200100","IVA SOPORTADO NO DEDUCIBLE (PRORRATA)","N","","",""} ,
350  { "47200101","IVA SOPORTADO NO DEDUCIBLE PENDIENTE DEVENGO (PRORRATA)","N","","",""} ,
351  { "47200104","04% INVERSIÓN SUJETO PASIVO SOPORTADA","N","","",""} ,
352  { "47200110","10% INVERSIÓN SUJETO PASIVO SOPORTADA","N","","",""} ,
353  { "47200121","21% INVERSIÓN SUJETO PASIVO SOPORTADA","N","","",""} ,
354  { "47300001","HACIENDA PÚBLICA RETENCIONES Y PAGOS A CUENTA","N","","",""} ,
355  { "47500001","HACIENDA PÚBLICA ACREEDORA POR CONCEPTOS FISCALES","N","","",""} ,
356  { "47510001","H. PÚBLICA ACREEDOR POR RETENCIONES PRACTICADAS","N","","",""} ,
357  { "47700000","IVA REPERCUTIDO 0%","N","","",""} ,
358  { "47700001","IVA REPERCUTIDO","N","","",""} ,
359  { "47700002","RECARGO REPERCUTIDO","N","","",""} ,
360  { "47700004","IVA REPERCUTIDO 4%","N","","",""} ,
361  { "47700010","IVA REPERCUTIDO 10%","N","","",""} ,
362  { "47700011","IVA REPERCUTIDO 4% CEE","N","","",""} ,
363  { "47700012","IVA REPERCUTIDO 10% CEE","","","",""} ,
364  { "47700013","IVA REPERCUTIDO 21% CEE","","000","",""} ,
365  { "47700020","RECARGO REPERCUTIDO 0%","N","","",""} ,
366  { "47700021","IVA REPERCUTIDO 21%","N","","",""} ,
367  { "47700024","RECARGO REPERCUTIDO 0.5%","N","","",""} ,
368  { "47700026","RECARGO REPERCUTIDO 5.2%","N","","",""} ,
369  { "47700027","RECARGO REPERCUTIDO 1.4%","N","","",""} ,
370  { "47700098","RECARGO REPERCUTIDO CRITERIO DE CAJA","N","","",""} ,
371  { "47700099","IVA REPERCUTIDO CRITERIO DE CAJA","N","","",""} ,
372  { "47700104","04% INVERSIÓN SUJETO PASIVO REPERCUTIDA","N","","",""} ,
373  { "47700110","10% INVERSIÓN SUJETO PASIVO REPERCUTIDA","N","","",""} ,
374  { "47700121","21% INVERSIÓN SUJETO PASIVO REPERCUTIDA","N","","",""} ,
375  { "52080001","DEUDAS POR EFECTOS DESCONTADOS","N","000","",""} ,
376  { "55500000","CUENTA PUENTE COBRO","N","000","",""} ,
377  { "55500001","CUENTA PUENTE PAGO","N","000","",""} ,
378  { "55500002","CUENTA PUENTE REPOSICION/RETIRADA","N","000","",""} ,
379  { "55509999","PARTIDAS PENDIENTES DE APLICACIÓN","N","000","",""} , //Bug 138950
380  { "56100000","DEPÓSITOS RECIBIDOS A CORTO PLAZO","N","000","",""} , //Bug 138950
381  { "57000000","CONTADO","N","000","",""} ,
382  { "57000001","CAJA EFECTIVO","N","000","",""} ,
383  { "57200000","TARJETAS","N","000","",""} ,
384  { "57200001","BANCOS","N","000","",""} ,
385  { "57300001","BANCO MONEDA EXTRANJERA","N","000","",""} ,
386  { "60000001","COMPRAS DE MERCADERÍAS","N","","02","G01"} ,
387  { "60000100","DESCUENTOS S/COMPRA POR PRONTO PAGO","","000","02","G01"} ,
388  { "60300001","COMPRAS PENDIENTES DE FACTURAR","","000","",""} ,
389  { "60500001","PORTES COMPRA","N","","",""} ,
390  { "60600000","DESCUENTO SOBRE COMPRAS POR PRONTO PAGO","N","000","",""} , // Bug 173592
391  { "60800000","DEVOLUCIONES DE COMPRAS","N","","",""} , // Bug 173592
392  { "60900000","RAPPELS POR COMPRAS","N","000","",""} , // Bug 173592
393  { "61000001","VARIACIÓN DE EXISTENCIAS DE MERCADERÍAS","N","","02","G02"} ,
394  { "62600000","GASTOS BANCARIOS","N","","08","G22"} ,
395  { "62600001","GASTOS IMPAGO","N","","08","G22"} ,
396  { "63100001","CANCELACIÓN IVA NO DEDUCIBLE","N","","10","G26"} ,
397  { "63410000","AJUSTES NEGATIVOS EN EL IVA DE ACTIVO CORRIENTE (PRORRATA)","N","","",""} ,
398  { "63420000","AJUSTES NEGATIVOS EN EL IVA DE INVERSIONES (PRORRATA)","N","","",""} ,
399  { "63910000","AJUSTES POSITIVOS EN EL IVA DE ACTIVO CORRIENTE (PRORRATA)","N","","",""} ,
400  { "63920000","AJUSTES POSITIVOS EN EL IVA DE INVERSIONES (PRORRATA)","N","","",""} ,
401  { "64000000","SUELDOS Y SALARIOS","N","","",""} , // Bug 173592
402  { "66800001","DIFERENCIAS NEGATIVAS DE CAMBIO","N","","",""} ,
403  { "70000001","VENTAS DE MERCADERÍAS","N","","18","I01"} ,
404  { "70000100","DESCUENTO S/VENTAS PRONTO PAGO","","000","18","I01"} ,
405  { "70500001","PORTES VENTA","N","","18","I01"} ,
406  { "70600000","DESCUENTO SOBRE VENTAS POR PRONTO PAGO","N","000","",""} , // Bug 173592
407  { "70800000","DEVOLUCIONES DE VENTAS","N","","",""} , // Bug 173592
408  { "70900000","RAPPELS POR VENTAS","N","","",""} , // Bug 173592
409  { "70700001","VENTAS PENDIENTES DE FACTURAR/CONTABILIZAR","","000","",""} ,
410  { "76800001","DIFERENCIAS POSITIVAS DE CAMBIO","N","","",""} ,
411  { "76900001","RECARGO FINANCIERO","N","","19","I07"} ,
412  { "76900002","INGRESOS POR REPERCUSIÓN DE GASTOS DE DEVOLUCIÓN","N","000","19","I07"}, //Bug 142346
413  { "80000001","GASTOS IMPUTADOS A PATRIMONIO NETO","N","000","",""}, //Task 148839
414  { "90000001","INGRESOS IMPUTADOS A PATRIMONIO NETO","N","000","",""} //Task 148839
415  };
416 
417 
421  private static List<string> _AddonsInstal = new List<string>() { "TPV", "LOTES", "AMORTIZA", "MAYORIST", "INFORAUT" };
422 
426  private static StringBuilder _cCadenaLog = new StringBuilder();
427 
431  private static Dictionary<string, string> _oAliasDBCopia = new Dictionary<string, string>();
432 
436  public static Dictionary<string, string> _oAliasDBEjerCopia = new Dictionary<string, string>();
437 
441  public static Dictionary<string, DB._TableInformationSchema> _dicCacheSchemaCopia = new Dictionary<string, DB._TableInformationSchema>();
442 
446  private static Dictionary<string, bool> _oAddonsOrigen = new Dictionary<string, bool>();
447 
448  #endregion PROPIEDADES PRIVADAS
449 
450  #region METODOS PÚBLICOS
451 
452  // PE-104958.
456  public static DataTable ObtenerTodosLosGrupos()
457  {
458  DataTable ldtGrupos = new DataTable();
459  string lcSql = "Select codigo, nombre From [EUROWINSYS].[dbo].[gruposemp]";
460  DB.SQLExec(lcSql, ref ldtGrupos);
461 
462  return ldtGrupos;
463  }
464 
465  // Task 151247. Sobrecarga para obtener todos los grupos del principal de grupo
469  public static DataTable ObtenerTodosLosGrupos(string grupoprincipal)
470  {
471  DataTable ldtGrupos = new DataTable();
472  string lcSql = "Select codigo, nombre From [EUROWINSYS].[dbo].[gruposemp] where codpripal = " + DB.SQLString(grupoprincipal);
473  DB.SQLExec(lcSql, ref ldtGrupos);
474 
475  return ldtGrupos;
476  }
477 
478  // PE-104958.
482  public static string ObtenerGestionEjerciciActualGrupo(string databaseComunes)
483  {
484  string databaseGestion = "";
485 
486  DataTable datatableEjercici = new DataTable();
487  string lcSql = "Select conexion From " + DB.SQLDatabaseReal(databaseComunes, "ejercici") + " Where [any] = " + DB.SQLString(DB._GetVariable("wc_any").ToString());
488 
489  DB.SQLExec(lcSql, ref datatableEjercici);
490  if (datatableEjercici.Rows.Count > 0)
491  {
492  databaseGestion = datatableEjercici.Rows[0]["conexion"].ToString().Trim();
493  }
494 
495  return databaseGestion;
496  }
497 
501  public static string ObtenerGestionGrupo(string databaseComunes)
502  {
503  String lcSql = "";
504  DataTable datatableEjercici = new DataTable();
505 
506  lcSql = String.Format("SELECT CONEXION, PREDET,[any] FROM {0} WHERE [any] = {1} UNION SELECT CONEXION, PREDET,[any] FROM {0} ORDER BY PREDET DESC ,[any] DESC", DB.SQLDatabaseReal(databaseComunes, "ejercici"), DB.SQLString(DB._GetVariable("wc_any").ToString()));
507  DB.SQLExec(lcSql, ref datatableEjercici);
508 
509  return datatableEjercici.Rows.Count > 0 ? datatableEjercici.Rows[0]["CONEXION"].ToString().Trim() : String.Empty;
510  }
511 
516  public static bool _BorrarGruposEmpXml()
517  {
518  bool llOk = true;
519  string lcRutaServidor = Convert.ToString(DB._GetVariable("wc_iniservidor")).Trim();
520 
521  // Si no tenemos ruta al servidor no hacemos nada.
522  if (!string.IsNullOrWhiteSpace(lcRutaServidor))
523  {
524  string lcFicheroXmlGrupos = Path.Combine(lcRutaServidor, "gruposemp.xml");
525  if (System.IO.File.Exists(lcFicheroXmlGrupos))
526  {
527  System.IO.File.Delete(lcFicheroXmlGrupos);
528  // Si despuésde borrar aún existe, devolvemos false.
529  if (System.IO.File.Exists(lcFicheroXmlGrupos))
530  llOk = false;
531  }
532  }
533 
534  return llOk;
535  }
536 
542  public static string _Obtener_CodGrupoPripal(string tcGrupo)
543  {
544  string lcCodGrupoPripal = "";
545 
546  lcCodGrupoPripal = Convert.ToString(DB.SQLValor("gruposemp", "codigo", tcGrupo, "codpripal", "eurowinsys"));
547 
548  return lcCodGrupoPripal;
549  }
550 
554  public static string _Obtener_NombreGrupo(string tcGrupo)
555  {
556  string lcNombreGrupo = "";
557 
558  lcNombreGrupo = Convert.ToString(DB.SQLValor("gruposemp", "codigo", tcGrupo, "nombre", "eurowinsys")).Trim();
559 
560  return lcNombreGrupo;
561  }
562 
563 
568  public static string _Obtener_CodigoGrupo_Inexistente()
569  {
570  string lcCodGrupo = "";
571  string lcNewDbComunes = "";
572  DataTable ldtAuxiliar = new DataTable();
573 
574  // Si no hay conexión a una instancia de servidor SQL no hay nada que averiguar.
575  _Error_Message = "";
576  if ( string.IsNullOrWhiteSpace(DB.Conexion) || string.IsNullOrWhiteSpace(DB.DbComunes) )
577  {
578  _Error_Message = "No se ha podido obtener un código de nuevo grupo, no se ha detectado conexión al servidor SQL.";
579  return "";
580  }
581 
582 
583  // Obtener nombre de nueva base de datos COMUNES inexistente en el servidor SQL (revisa COMU0001, COMU0002, COMU0003 ...
584  // y así hasta que encuentra un código desocupado.)
585  lcNewDbComunes = DB._Obtener_NuevaDb_Comunes("COMU", 8);
586  if (string.IsNullOrWhiteSpace(lcNewDbComunes))
587  {
588  _Error_Message = "No se ha podido obtener un código de nuevo grupo, no se pudo obtener el nombre para una nueva base de datos de COMUNES.";
589  return "";
590  }
591 
592 
593  // Revisar que el código obtenido tenga el formato correcto.
594  if (!string.IsNullOrWhiteSpace(lcNewDbComunes) && lcNewDbComunes.Length == 8)
595  lcCodGrupo = lcNewDbComunes.Substring(4,4);
596  if (string.IsNullOrWhiteSpace(lcCodGrupo))
597  {
598  _Error_Message = "No se ha podido obtener un código de nuevo grupo, formato incorrecto para el nombre de la nueva base de datos de COMUENES.";
599  return "";
600  }
601 
602  // El código de grupo detectado no existe como base de datos, no debería existir por tanto tampoco en la tabla de grupos, si existe lo borramos
603  // pues podria provocar problemas desde visual al intentar crear un nuevo grupo pero ya existiese en la tabla de grupos
604  DB.SQLExec("select codigo from " + DB.SQLDatabase("eurowinsys", "gruposemp") + " where codigo='" + lcCodGrupo + "'", ref ldtAuxiliar);
605  if (ldtAuxiliar.Rows.Count > 0 && Convert.ToString(ldtAuxiliar.Rows[0]["codigo"]) == lcCodGrupo)
606  DB.SQLExec("delete from " + DB.SQLDatabase("eurowinsys", "gruposemp") + " where codigo='" + lcCodGrupo + "'");
607 
608 
609  return lcCodGrupo;
610  }
611 
612 
619  public static string _Obtener_RutaLog_Automatica(string tcCodigo, int tnTipo)
620  {
621  string lcRutaLog = GrupoempTools._Euroserv.Trim();
622  if (string.IsNullOrWhiteSpace(lcRutaLog))
623  lcRutaLog = Path.GetTempPath();
624 
625  if (!lcRutaLog.EndsWith("\\"))
626  lcRutaLog += "\\";
627 
628  string lcFecha = DateTime.Now.Date.ToString("yyyyMMdd");
629  string lcHora = DateTime.Now.ToLongTimeString().Replace(":", "");
630 
631  lcRutaLog += (tnTipo == 1 ? "log_creagremp_" : (tnTipo == 2 ? "log_borragremp_" : "log_creaejer_")) + tcCodigo + "_" + lcFecha + "_" + lcHora + ".txt";
632 
633  return lcRutaLog;
634  }
635 
636 
644  public static int _Obtener_Numero_Grupos(out string tcGrupoActual, out string tcGrupoPripal, out List<string> tlsGrupos)
645  {
646  tlsGrupos = new List<string>();
647  tcGrupoActual = "";
648  tcGrupoPripal = "";
649 
650  // Si no hay conexión a una instancia de servidor SQL no hay nada que averiguar.
651  _Error_Message = "";
652  if (string.IsNullOrWhiteSpace(DB.Conexion) || string.IsNullOrWhiteSpace(DB.DbComunes))
653  {
654  _Error_Message = "No se ha podido obtener el número de grupos existentes, no se ha detectado conexión al servidor SQL.";
655  tcGrupoActual = "";
656  tcGrupoPripal = "";
657  return 0;
658  }
659 
660  // Partimos del COMUNES al que estamos conectados.
661  string lcComunesActual = DB.DbComunes;
662  DataTable ldtAuxiliar = new DataTable();
663 
664 
665  // Averiguar el codigo de grupo origen correspondiente al grupo en el que estoy conectado (podría ser el mismo grupo)
666  tcGrupoActual = DB.DbComunes.Trim().Substring(4, 4);
667  DB.SQLExec("select codpripal from " + DB.SQLDatabase("eurowinsys", "gruposemp") + " where codigo='" + tcGrupoActual + "'", ref ldtAuxiliar);
668  if (ldtAuxiliar.Rows.Count == 0)
669  {
670  _Error_Message = "No se ha podido obtener el número de grupos existentes, no se ha encontrado el grupo actual " + tcGrupoActual + " en la tabla de grupos.";
671  return 0;
672  }
673 
674  tcGrupoPripal = Convert.ToString(ldtAuxiliar.Rows[0]["codpripal"]);
675  if (string.IsNullOrWhiteSpace(tcGrupoPripal))
676  {
677  _Error_Message = "No se ha podido obtener el número de grupos existentes, no se ha podido averiguar el código de grupo principal correspondiente al grupo actual " + tcGrupoActual + " en la tabla de grupos.";
678  return 0;
679  }
680 
681 
682  // Cuento cuantos grupos cuelgan de este grupo origen
683  DB.SQLExec("select codigo from " + DB.SQLDatabase("eurowinsys", "gruposemp") + " where codpripal='" + tcGrupoPripal + "'", ref ldtAuxiliar);
684  if (ldtAuxiliar.Rows.Count == 0)
685  {
686  _Error_Message = "No se ha podido obtener el número de grupos existentes, se han detectado 0 grupos asociados al grupo origen " + tcGrupoPripal + " en la tabla de grupos.";
687 
688  return 0;
689  }
690 
691 
692  // Bug 157079 - Comprobar que exista el comunes correspondiente
693  foreach (DataRow dtRow in ldtAuxiliar.Rows)
694  {
695  string lcCodigo = Convert.ToString(dtRow["codigo"]).Trim().ToUpper();
696  if (DB._SQLExisteBBDD("COMU" + lcCodigo))
697  tlsGrupos.Add(lcCodigo);
698  }
699 
700 
701  int lnCuantosGrupos = tlsGrupos.Count;
702  if (lnCuantosGrupos == 1)
703  {
704  if (tcGrupoActual != tcGrupoPripal)
705  {
706  _Error_Message = "No se ha podido obtener el número de grupos existentes, se han detectado incoherencia en los datos de la tabla de grupos: " +
707  "Se ha detectado un solo grupo en la instalación actual pero con diferente codificación para el grupo actual " + tcGrupoActual + " " +
708  "y el grupo origen " + tcGrupoPripal;
709  return 0;
710  }
711  }
712 
713  //tlsGrupos = ldtAuxiliar.AsEnumerable().Select(x => x[0].ToString().ToUpper()).ToList();
714 
715  return lnCuantosGrupos;
716  }
717 
718 
729  public static bool _Crear_Ejercicio(string tcGrupoOrigen, string tcEjerOrigen, string tcEjerNuevo, DateTime tdFIniEjerNuevo, DateTime tdFFinEjerNuevo, bool tlMarcarEjerPredet = false)
730  {
731  bool llOk = false;
732 
733 
734  // Inicializamos la cadena de log, tanto si logueamos como si no.
735  GrupoempTools._cCadenaLog = new StringBuilder();
736 
737  // Si se ha de loguear y no han declarado el fichero de log lo ponemos automático.
738  if (_Log)
739  {
740  if (string.IsNullOrWhiteSpace(_RutaFicheroLog))
741  _RutaFicheroLog = GrupoempTools._Obtener_RutaLog_Automatica(tcEjerNuevo, 3);
742  }
743 
744 
745 
747 
748  // Comprobar que los parámetros llegan tal como se espera.
749  Dictionary<string, object> lodDicParam = new Dictionary<string, object>();
750  lodDicParam.Add("tcgrupoorigen", tcGrupoOrigen);
751  lodDicParam.Add("tcejerorigen", tcEjerOrigen);
752  lodDicParam.Add("tcejernuevo", tcEjerNuevo);
753  lodDicParam.Add("tdfiniejernuevo", tdFIniEjerNuevo);
754  lodDicParam.Add("tdffinejernuevo", tdFFinEjerNuevo);
755  llOk = GrupoempTools.CrearEjercicio_Comprobar_Parametros(lodDicParam);
756  if (!llOk)
757  {
758  if (_Log)
759  {
760  Guardar_Mensaje("Paso incorrecto de parametros al método _Crear_Ejercicio()");
761  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
762  }
763  return false;
764  }
765 
766 
767  // Inicializa propiedades internas.
768  // La propiedad _Log no se inicializa, se selecciona externamente a la llamada a _Crear_Ejercicio()
769  GrupoempTools._ResetearPropiedades();
770 
771 
772 
773 
774  if (_Log)
775  Guardar_Mensaje("CREACIÓN DE NUEVO EJERCICIO " + tcEjerNuevo + " EN GRUPO " + tcGrupoOrigen + " A PARTIR DE EJERCICIO " + tcEjerOrigen + Environment.NewLine);
776 
777  // Obtener todos los datos que nos hacen falta para poder hacer el BACKUP y el RESTORE posterior de la bd de ejercicio, y comprobar que todo esté correcto, que la nueva bd. no existe, que la bd origen sí exista, que el ejercicio origen exista, etc.
778  llOk = GrupoempTools.CrearEjercicio_Comprobaciones_Previas(tcGrupoOrigen, tcEjerOrigen, tcEjerNuevo);
779  if (!llOk)
780  {
781  if (_Log)
782  CopiarStringLog_Fichero(_RutaFicheroLog);
783  return false;
784  }
785 
786  // Aqui tenemos informado:
787  // GrupoempTools._GrupoOrigen
788  // GrupoempTools._DbComunesGrOrigen
789  // GrupoempTools._DbEjerGrOrigen
790  // GrupoempTools._SufiBdEjerGrNuevo
791  // GrupoempTools._DbEjerGrNuevo
792  // GrupoempTools._EmpresaGrNuevo;
793  // GrupoempTools._UserPropBdGrNuevo
794  GrupoempTools._EjerOrigen = tcEjerOrigen;
795  GrupoempTools._EjerNuevo = tcEjerNuevo;
796  GrupoempTools._FechaIniEjerNuevo = tdFIniEjerNuevo;
797  GrupoempTools._FechaFinEjerNuevo = tdFFinEjerNuevo;
798  GrupoempTools._EjerNuevoMarcarPredet = tlMarcarEjerPredet; // El ejercicio que se crea quedará marcado como predeterminado en COMUNES!EJERCICI según lo que haya pasado por parámetro el usuario
799 
800 
801 
802 
803  // Via libre para crear el ejercicio, coger la base de datos del EJERCICIO que se ha pedido del grupo origen, hacer copia de seguridad de ella
804  // y restaurarla con el nuevo nombre, luego ya vaciaremos todas las tablas menos las de sistema (COMUNES.TABSYS)
805  // y se haran los ajustes adicionales necesarios en las otras tablas en que sea necesario hacer algo.
806 
807 
808 
809  // ATENCION!! ATENCION !!
810  // Si la operativa de BACKUP-RESTORE fuese lento se puede probar el segundo sistema que es creando la base de datos directamente y
811  // creando los indices y valores por defecto manualmente, tabla por tabla, para ello antes de realizar la llamada a _Crear_Ejercicio()
812  // deberá ponerse la propiedad siguiente
813  //
814  // GrupoempTools._TipoOperativaCreacionGrupoEjer = GrupoempTools.TipoOperativaCreacion.PorTablas;
815 
816 
817  if (GrupoempTools._TipoOperativaCreacionGrupoEjer == GrupoempTools.TipoOperativaCreacion.PorCopiaRestauracionBd)
818  {
823  llOk = GrupoempTools.CrearEjercicio_BackupBd();
824  if (!llOk)
825  {
826  if (_Log)
827  CopiarStringLog_Fichero(_RutaFicheroLog);
828  return false;
829  }
830 
831 
836  llOk = GrupoempTools.CrearEjercicio_RestoreBd();
837  if (!llOk)
838  {
839  // Algo no fue bien, en teoria aqui deberiamos borrar la base de datos que se pudiera haber creado pero no vamos a hacerlo para evitar
840  // el riesgo de que accidentalmente por algún bug o por el motivo que sea se acabe borrando una base de datos que no toque.
841  if (_Log)
842  CopiarStringLog_Fichero(_RutaFicheroLog);
843  return false;
844  }
845  }
846  else
847  {
853  llOk = GrupoempTools.CrearEjercicio_CrearBd();
854  if (!llOk)
855  {
856  if (_Log)
857  CopiarStringLog_Fichero(_RutaFicheroLog);
858  return false;
859  }
860 
861 
867  llOk = GrupoempTools.CrearEjercicio_CrearTablasBd();
868  if (!llOk)
869  {
870  if (_Log)
871  CopiarStringLog_Fichero(_RutaFicheroLog);
872  return false;
873  }
874  }
875 
876 
881  llOk = GrupoempTools.CrearEjercicio_AjustarDatosBd();
882  if (!llOk)
883  {
884  // Algo no fue bien, en teoria aqui deberiamos borrar la base de datos que se pudiera haber creado pero no vamos a hacerlo para evitar
885  // el riesgo de que accidentalmente por algún bug o por el motivo que sea se acabe borrando una base de datos que no toque.
886  if (_Log)
887  CopiarStringLog_Fichero(_RutaFicheroLog);
888  return false;
889  }
890 
892 
893  // Proceso concluido, informamos de las bds. creadas.
894  if (_Log)
895  {
896  Guardar_Mensaje("PROCESO DE CREACIÓN DE EJERCICIO " + tcEjerNuevo + " FINALIZADO." + Environment.NewLine);
897 
898  Guardar_Mensaje("Se ha creado la siguiente bases de datos:");
899  Guardar_Mensaje("GESTION: " + GrupoempTools._DbEjerGrNuevo);
900 
901  CopiarStringLog_Fichero(_RutaFicheroLog);
902  }
903 
904  return true;
905 
906  }
907 
908 
925  public static bool _Crear_Grupo(string tcGrupo, string tcNombreGrupo, string tcEjercicio, string tcNombreEmpresa, string tcCifEmpresa, string tcGrOrigen="", bool tlConservarClientes=false,
926  bool tlConservarUsuarios=false, bool tlEjerPartido=false, DateTime? tdEjerPartiFIni = null, DateTime? tdEjerPartiFFin = null, bool tlLongitudesEstandar=false)
927  {
928  bool llOk=false;
929 
930  ActualizarBarraProgreso();
931 
932  // Inicializamos la cadena de log, tanto si logueamos como no.
933  GrupoempTools._cCadenaLog = new StringBuilder();
934 
935  // Si se ha de loguear pero no tenemos la ruta al fichero de log instanciada la asignamos automaticamente, apuntará a un txt en EUROSERV\
936  if (_Log)
937  {
938  if (string.IsNullOrWhiteSpace(_RutaFicheroLog))
939  _RutaFicheroLog = GrupoempTools._Obtener_RutaLog_Automatica(tcGrupo, 1);
940  }
941 
942  // Comprobar que los parámetros llegan tal como se espera.
943  Dictionary<string,object> lodDicParam = new Dictionary<string,object>();
944  lodDicParam.Add("tcgrupo",tcGrupo);
945  lodDicParam.Add("tcnombregrupo",tcNombreGrupo);
946  lodDicParam.Add("tcejercicio",tcEjercicio);
947  lodDicParam.Add("tcnombreempresa",tcNombreEmpresa);
948  lodDicParam.Add("tccifempresa",tcCifEmpresa);
949  lodDicParam.Add("tcgrorigen",tcGrOrigen);
950  lodDicParam.Add("tlconservarclientes", tlConservarClientes);
951  lodDicParam.Add("tlconservarusuarios", tlConservarUsuarios);
952  lodDicParam.Add("tlejerpartido",tlEjerPartido);
953  lodDicParam.Add("tdejerpartifini",tdEjerPartiFIni);
954  lodDicParam.Add("tdejerpartiffin",tdEjerPartiFFin);
955  lodDicParam.Add("tlLongitudesEstandar", tlLongitudesEstandar);
956 
957  llOk = CrearGrupo_Comprobar_Parametros(lodDicParam);
958  if (!llOk)
959  {
960  if (_Log)
961  {
962  Guardar_Mensaje("Paso incorrecto de parametros al método _Crear_Grupo()");
963  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
964  }
965  return false;
966  }
967 
968 
969  // Inicializa propiedades internas, las unicas propiedades que no se inicializan son:
970  // _Log: si se ha de loguear el proceso.
971  // _RutaFicheroLog: ruta al fichero de log
972  // _Euroserv: carpeta de Euroserv de la instalación, es necesario por que al acabar la creacion se actualiza CFGCLISRV.XML en esta carpeta
973  // _TipoOperativaCreaGrupoEjer
974  GrupoempTools._ResetearPropiedades();
975 
976 
977  if (_Log)
978  Guardar_Mensaje("CREACION DE NUEVO GRUPO: " + tcGrupo + Environment.NewLine);
979 
980 
981  // Asignar las propiedades internas que se pueda con los parámetros recibidos.
982  GrupoempTools.CrearGrupo_AsignarPropiedades(lodDicParam);
983 
984  // Realizar todas las comprobaciones necesarias para evitar conflictos durante la creación del grupo, no existencia de las bases de datos que se van a crear, existencia de la tabla TABSYS donde toca con datos, etc.
985  // Recordar que en el nuevo grupo solo van los ADDONS standar que se instalan en Sage50
986  // (TPV, LOTES, MAYORIST, INFORAUT y AMORTIZA), si tuviese algun ADDON mas no lo tendrá el nuevo grupo.
987  llOk = GrupoempTools.CrearGrupo_Comprobaciones_Previas(tcGrupo, tcGrOrigen);
988  if (!llOk)
989  {
990  if (_Log)
991  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
992  return false;
993  }
994  ActualizarBarraProgreso();
995 
996 
997  // Via libre para crear el grupo, coger la base de datos de COMUNES, ADDONS y EJERCICIO predet
998  // del grupo origen detectado, hacer copia de seguridad de ellas y restaurarlas con el nuevo nombre,
999  // y luego ya vaciaremos todas las tablas menos las de sistema (COMUNES.TABSYS y ADDONS.TABSYS)
1000  // y se haran los ajustes adicionales necesarios en las otras tablas en que sea necesario hacer algo.
1001 
1002 
1003 
1004  // ATENCION!! ATENCION !!
1005  // Si la operativa de BACKUP-RESTORE fuese lento se puede probar el segundo sistema que es creando las bases de datos directamente y
1006  // creando los indices y valores por defecto manualmente, tabla por tabla, para ello antes de realizar la llamada a _Crear_Grupo()
1007  // deberá ponerse la propiedad siguiente
1008  //
1009  // GrupoempTools._TipoOperativaCreacionGrupoEjer = GrupoempTools.TipoOperativaCreacion.PorTablas;
1010 
1011 
1012  if (GrupoempTools._TipoOperativaCreacionGrupoEjer == GrupoempTools.TipoOperativaCreacion.PorCopiaRestauracionBd)
1013  {
1018  llOk = GrupoempTools.CrearGrupo_BackupsBds();
1019  if (!llOk)
1020  {
1021  if (_Log)
1022  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
1023  return false;
1024  }
1025  ActualizarBarraProgreso();
1026 
1031  llOk = GrupoempTools.CrearGrupo_RestoreBds();
1032  if (!llOk)
1033  {
1034  // Algo no fue bien, en teoria aqui deberiamos borras las bases de datos que se pudieran haber creado del nuevo grupo pero no vamos a hacerlo para evitar
1035  // el riesgo de que accidentalmente por algún bug o por el motivo que sea se acabe borrando una base de datos que no toque, si se quisiese asumir este riesgo
1036  // poner aqui antes del return false una llamada a GrupoempTools.CrearGrupo_BorrarBdsNuevas()
1037  if (_Log)
1038  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
1039  return false;
1040  }
1041  ActualizarBarraProgreso();
1042  }
1043  else
1044  {
1046 
1047 
1053  llOk = GrupoempTools.CrearGrupo_CrearBds();
1054  if (!llOk)
1055  {
1056  // Algo no fue bien, en teoria aqui deberiamos borras las bases de datos que se pudieran haber creado del nuevo grupo pero no vamos a hacerlo para evitar
1057  // el riesgo de que accidentalmente por algún bug o por el motivo que sea se acabe borrando una base de datos que no toque.
1058  if (_Log)
1059  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
1060  return false;
1061  }
1062  ActualizarBarraProgreso();
1063 
1069  llOk = GrupoempTools.CrearGrupo_CrearTablasBds();
1070  if (!llOk)
1071  {
1072  // Algo no fue bien, en teoria aqui deberiamos borras las bases de datos que se pudieran haber creado del nuevo grupo pero no vamos a hacerlo para evitar
1073  // el riesgo de que accidentalmente por algún bug o por el motivo que sea se acabe borrando una base de datos que no toque.
1074  if (_Log)
1075  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
1076  return false;
1077  }
1078  ActualizarBarraProgreso();
1079  }
1080 
1085  llOk = GrupoempTools.CrearGrupo_AjustarDatosBds();
1086  if (!llOk)
1087  {
1088  // Algo no fue bien, en teoria aqui deberiamos borras las bases de datos que se pudieran haber creado del nuevo grupo pero no vamos a hacerlo para evitar
1089  // el riesgo de que accidentalmente por algún bug o por el motivo que sea se acabe borrando una base de datos que no toque, si se quisiese asumir este riesgo
1090  // poner aqui antes del return false una llamada a GrupoempTools.CrearGrupo_BorrarBdsNuevas()
1091  if (_Log)
1092  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
1093  return false;
1094  }
1095  ActualizarBarraProgreso();
1096 
1097 
1103 
1104  // ACTUALIZAR EUROWINSYS.GRUPOSEMP: Buscamos si el grupo existe en la tabla de grupos y si no existe lo creamos.
1105  //
1106  // Desde Sage50 via formulario de grupos al crear un nuevo grupo en este punto existirá ya el registro en la tabla
1107  // pues los mantenimientos visuales al crar un nuevo código ya lo inserta en la tabla y si al final se cancela se borra, por tanto en ese caso unicamnete
1108  // UPDATAREMOS el nombre.
1109  //
1110  // En el caso de que se llame a este método desde el DTS de Contaplus/FacturaPlus el registro no existirá y deberá
1111  // crearse en este punto.
1112  if (_Log)
1113  Guardar_Mensaje("Actualizacion de tabla de grupos.");
1114  GrupoempTools.CrearGrupo_AnadirGrupo_Gruposemp(tcGrupo, tcNombreGrupo);
1115  if (_Log)
1116  Guardar_Mensaje("Actualizacion de euroserv\\gruposemp.xml.");
1117 
1118 
1119 
1120  // ACTUALIZAR EUROSERV\GRUPOSEMP.XML A PARTIR DE EUROWINSYS.GRUPOSEMP
1121  string lcEuroserv = GrupoempTools._Euroserv.Trim();
1122  DB._GrupoEmpresa_Table2Xml(Path.Combine(lcEuroserv,"gruposemp.xml"));
1123 
1124 
1125 
1126  // ACTUALIZAR EUROSERV\CFGCLISRV.XML Y EUROSERV\CFGCLISRV.DBF
1127  if (_Log)
1128  Guardar_Mensaje("Actualizacion de CFGCLISRV.");
1129  llOk = GrupoempTools.CrearGrupo_AnadirGrupo_CfgCliSrv();
1130  if (!llOk)
1131  {
1132  if (_Log)
1133  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
1134  return false;
1135  }
1136  ActualizarBarraProgreso();
1137 
1138  // FIN !!
1139 
1140 
1141  // Proceso concluido, informamos de las bds. creadas.
1142  if (_Log)
1143  {
1144  Guardar_Mensaje("PROCESO DE CREACIÓN DE GRUPO "+tcGrupo+" FINALIZADO."+Environment.NewLine);
1145  Guardar_Mensaje("Se han creado las siguientes bases de datos:");
1146  Guardar_Mensaje("COMUNES: " + _DbComunesGrNuevo);
1147  Guardar_Mensaje("GESTION: " + _DbEjerGrNuevo);
1148  string lcNombreAddon = "", lcBdAddon = "";
1149  foreach (DataRow loRow in _dtBdAddonsGrNuevo.Rows)
1150  {
1151  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim();
1152  lcBdAddon = Convert.ToString(loRow["nom_conex"]).Trim();
1153  Guardar_Mensaje("ADDON DE " + lcNombreAddon + ": " + lcBdAddon);
1154  }
1155 
1156  GrupoempTools.CopiarStringLog_Fichero(_RutaFicheroLog);
1157  }
1158 
1159  ActualizarBarraProgreso();
1160 
1161  return true;
1162  }
1163 
1167  public static void _ResetearPropiedades()
1168  {
1169 
1170  // Las propiedades _Log, _RutaFicheroLog y _Euroserv son las únicas que no se inicializan,
1171  // se declaran externamente antes de llamar a _Crear_Grupo, _Borrar_Grupo(), _Crear_Ejercicio()
1172  if (_Log)
1173  Guardar_Mensaje("Inicializando propiedades internas.");
1174 
1175  // PROPIEDADES DE CREACION DE NUEVO GRUPO Y CREACION NUEVO EJERCICIO
1176 
1177  // Propiedades del grupo origen de la instalación de Sage50
1178  GrupoempTools._GrupoPrincipal = "";
1179  GrupoempTools._GrupoOrigen = "";
1180  GrupoempTools._DbComunesGrOrigen = "";
1181  GrupoempTools._DbEjerGrOrigen = "";
1182  GrupoempTools._dtBdAddonsGrOrigen = new DataTable();
1183  GrupoempTools._EjerOrigen = "";
1184  GrupoempTools._FechaIniEjerOrigen = null;
1185  GrupoempTools._FechaFinEjerOrigen = null;
1186 
1187  // Propiedades del nuevo grupo a crear.
1188  GrupoempTools._DbComunesGrNuevo = "";
1189  GrupoempTools._DbEjerGrNuevo = "";
1190  GrupoempTools._dtBdAddonsGrNuevo = new DataTable();
1191  GrupoempTools._SufiBdEjerGrNuevo = "";
1192  GrupoempTools._EjerNuevo = "";
1193  GrupoempTools._FechaIniEjerNuevo = null;
1194  GrupoempTools._FechaFinEjerNuevo = null;
1195  GrupoempTools._EmpresaGrNuevo = "";
1196  GrupoempTools._CfgEjerPartiGrNuevo = false;
1197  GrupoempTools._EjerNuevoMarcarPredet = false;
1198 
1199  GrupoempTools._NombreEmpresa = "";
1200  GrupoempTools._CifEmpresa = "";
1201  GrupoempTools._ConservarClientes = false;
1202  GrupoempTools._ConservarUsuarios = false;
1203  GrupoempTools._ConservarArticulos = false;
1204  GrupoempTools._ConservarProveedores = false;
1205  GrupoempTools._LongitudesEstandar = false;
1206 
1207  GrupoempTools._LenCuenta = 8;
1208  GrupoempTools._LenMarca = 2;
1209  GrupoempTools._LenFamilia = 2;
1210  GrupoempTools._LenVendedor = 2;
1211  GrupoempTools._LenAlmacen = 2; // Bug 109147
1212  GrupoempTools._PrefijoCli3 = "430";
1213  GrupoempTools._PrefijoDeudor3 = "440";
1214  GrupoempTools._PrefijoPro3 = "400";
1215  GrupoempTools._PrefijoAcr3 = "410";
1216  GrupoempTools._PrefijoBan3 = "572";
1217  GrupoempTools._PrefijoCaj3 = "570";
1218  GrupoempTools._PrefijoCom3 = "600";
1219  GrupoempTools._PrefijoVen3 = "700";
1220  GrupoempTools._UserPropBdGrNuevo = "Sage50";
1221  GrupoempTools._CarpetaBackupServidorSql = "";
1222 
1223 
1224  // PROPIEDADES DE BORRADO DE GRUPO
1225  GrupoempTools._DbComunesGrBorrar = "";
1226  GrupoempTools._dtBdEjerGrBorrar = new DataTable();
1227  GrupoempTools._dtBdAddonsGrBorrar = new DataTable();
1228 
1229  // OTROS
1230  GrupoempTools._Error_Message = "";
1231  }
1232 
1238  public static bool _Borrar_Grupo(string tcGrupo)
1239  {
1240  bool llOk = true;
1241  bool llOk2 = true;
1242  string tcCadenaError = "Hubo un problema con la eliminación de las bases de datos siguientes: ";
1243 
1244  ActualizarBarraProgreso();
1245 
1246  // INICIALIZAR PROPIEDADES
1247  // Inicializa propiedades internas, las unicas propiedades que no se inicializan son:
1248  // _Log: si se ha de loguear el proceso.
1249  // _RutaFicheroLog: ruta al fichero de log.
1250  // _Euroserv: carpeta de Euroserv de la instalación, es necesario por que al acabar la creacion se actualiza CFGCLISRV.XML en esta carpeta
1251  // _TipoOperativaCreacionGrupoEjer: tipo operativa creación grupo y ejercicio
1252  // y la cadena de log en la que acumulamos las incidencias de log
1253  GrupoempTools._cCadenaLog = new StringBuilder();
1254  GrupoempTools._ResetearPropiedades();
1255 
1256 
1257  // Si se ha de loguear pero no tenemos la ruta al fichero de log instanciada la asignamos automaticamente, apuntará a un txt en EUROSERV\
1258  if (_Log)
1259  {
1260  if (string.IsNullOrWhiteSpace(_RutaFicheroLog))
1261  _RutaFicheroLog = GrupoempTools._Obtener_RutaLog_Automatica(tcGrupo, 2);
1262  }
1263 
1264 
1265  // Si no hay conexión a una instancia de servidor SQL no hay nada que hacer.
1266  if (string.IsNullOrWhiteSpace(DB.Conexion) || string.IsNullOrWhiteSpace(DB.DbComunes))
1267  {
1268  _Error_Message = "No se ha detectado conexión al servidor SQL, no se borrará el grupo.";
1269  if (_Log)
1270  {
1271  Guardar_Mensaje(_Error_Message);
1272  CopiarStringLog_Fichero(_RutaFicheroLog);
1273  }
1274  return false;
1275  }
1276 
1277  if (string.IsNullOrWhiteSpace(GrupoempTools._Euroserv))
1278  {
1279  _Error_Message = "No se ha dado valor a la propiedad _Euroserv de la clase GrupoempTools y es necesaria para la eliminacion del grupo, no se borrará el grupo.";
1280  if (_Log)
1281  {
1282  Guardar_Mensaje(_Error_Message);
1283  CopiarStringLog_Fichero(_RutaFicheroLog);
1284  }
1285  return false;
1286  }
1287 
1288 
1289  if (_Log)
1290  {
1291  Guardar_Mensaje("GRUPO A ELIMINAR: " + tcGrupo + Environment.NewLine);
1292  Guardar_Mensaje("INICIO DE COMPROBACIONES PREVIAS ANTES DE PROCEDER A BORRAR EL GRUPO."+Environment.NewLine);
1293  }
1294 
1295  ActualizarBarraProgreso();
1296 
1297 
1298  // COMPROBACIONES PREVIAS
1299  // Obtener todos los datos que nos hacen falta para poder hacer el BACKUP y el RESTORE posteiror.
1300  llOk = GrupoempTools.BorrarGrupo_Comprobaciones_Previas(tcGrupo);
1301  ActualizarBarraProgreso();
1302 
1303  // Despues de la llamada anterior las siguientes propiedades deberían estar informadas:
1304  // GrupoempTools._DbComunesGrBorrar
1305  // GrupoempTools._dtBdEjerGrBorrar
1306  // GrupoempTools._dtBdAddonsGrBorrar
1307 
1308  if (!llOk)
1309  {
1310  if (_Log)
1311  CopiarStringLog_Fichero(_RutaFicheroLog);
1312  return false;
1313  }
1314 
1315  if (_Log)
1316  {
1317  Guardar_Mensaje("Comprobaciones previas al borrado de grupo satisfactorias: OK."+Environment.NewLine);
1318  Guardar_Mensaje("Fin comprobaciones previas antes de revisar bases de datos." + Environment.NewLine);
1319  }
1320  ActualizarBarraProgreso();
1321 
1322 
1323  // Inicio de proceso de comprobación bases de datos.
1324  if (_Log)
1325  {
1326  Guardar_Mensaje("Inicio comprobación bases de datos del grupo " + tcGrupo + Environment.NewLine);
1327  }
1328  ActualizarBarraProgreso();
1329 
1330 
1331  // COMPROBACIONES BASES DE DATOS
1332  llOk = GrupoempTools.RevisarBaseDatosEnUso();
1333  ActualizarBarraProgreso();
1334 
1335  if (!llOk)
1336  {
1337  if (_Log)
1338  CopiarStringLog_Fichero(_RutaFicheroLog);
1339  return false;
1340  }
1341 
1342  if (_Log)
1343  {
1344  Guardar_Mensaje("Comprobaciones bases de datos: OK." + Environment.NewLine);
1345  Guardar_Mensaje("FIN DE COMPROBACIONES PREVIAS ANTES DE PROCEDER A BORRAR EL GRUPO." + Environment.NewLine);
1346  }
1347  ActualizarBarraProgreso();
1348 
1349 
1350 
1351  // ELIMINACION DEL GRUPO
1352  // En principio, via libre para eliminar el grupo, eliminará el COMUNES,
1353  // todas las bd que encuentra en COMUNES.EJERCICI y todas las bd que encuentre en COMUNES.MODULOS, la COMUNES
1354  // debe ser la ultima bd a eliminar.
1355 
1356  // Inicio de proceso de borrado de bases de datos.
1357  if (_Log)
1358  {
1359  Guardar_Mensaje("INICIO PROCESO DE ELIMINACION DE BASES DE DATOS DEL GRUPO " + tcGrupo + Environment.NewLine);
1360  Guardar_Mensaje("BORRADO DE BASES DE DATOS DE ADDONS"+Environment.NewLine);
1361  }
1362  ActualizarBarraProgreso();
1363 
1364 
1365 
1366  // ELIMINACION DE LAS BASES DE DATOS DE LOS ADD-ONS
1367  string lcBd = "";
1368  string lcNombreAddon = "";
1369 
1370  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrBorrar.Rows)
1371  {
1372  lcBd = Convert.ToString(loRow["nom_conex"]).Trim();
1373  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim();
1374 
1375  llOk2 = BorrarGrupo_Remove_Bd(lcBd, lcNombreAddon);
1376  llOk = llOk && llOk2;
1377 
1378  if (!llOk2)
1379  tcCadenaError += lcNombreAddon+" ("+lcNombreAddon+") ";
1380  }
1381  ActualizarBarraProgreso();
1382 
1383  if (_Log)
1384  {
1385  Guardar_Mensaje(Environment.NewLine);
1386  Guardar_Mensaje("BORRADO DE BASES DE DATOS DE EJERCICIOS"+Environment.NewLine);
1387  }
1388 
1389 
1390  // ELIMINACION DE LAS BASES DE DATOS DE LOS EJERCICIOS
1391  string lcAny = "";
1392  foreach (DataRow loRow in GrupoempTools._dtBdEjerGrBorrar.Rows)
1393  {
1394  lcBd = Convert.ToString(loRow["conexion"]).Trim();
1395  lcAny = Convert.ToString(loRow["any"]).Trim();
1396 
1397  llOk2 = BorrarGrupo_Remove_Bd(lcBd, "EJERCICIO " + lcAny);
1398  llOk = llOk && llOk2;
1399 
1400  if (!llOk2)
1401  tcCadenaError += "EJERCICIO " + lcAny+" ("+lcBd+") ";
1402  }
1403  ActualizarBarraProgreso();
1404 
1405 
1406  if (_Log)
1407  {
1408  Guardar_Mensaje(Environment.NewLine);
1409  Guardar_Mensaje("BORRADO DE BASE DE DATOS DE COMUNES"+Environment.NewLine);
1410  }
1411 
1412  // Si todo lo anterior fue bien, vamos a eliminar la base de datos de COMUNES que es la única que falta.
1413  // ELIMINACION DE LAS BASES DE DATOS DE COMUNES
1414  llOk2 = BorrarGrupo_Remove_Bd(GrupoempTools._DbComunesGrBorrar, "COMUNES");
1415  llOk = llOk && llOk2;
1416  if (llOk2 == false)
1417  tcCadenaError += "COMUNES (" + GrupoempTools._DbComunesGrBorrar + ") ";
1418 
1419  ActualizarBarraProgreso();
1420 
1421  if (llOk)
1422  {
1423  if (_Log)
1424  {
1425  Guardar_Mensaje(Environment.NewLine);
1426  Guardar_Mensaje("PROCESO DE BORRADO DE GRUPO " + tcGrupo + " FINALIZADO CORRECTAMENTE.");
1427  }
1428 
1429 
1430  if (_Log)
1431  Guardar_Mensaje("Borrado de grupo de la tabla de grupos.");
1432  // Borramos el registro de la tabla de grupos
1433  DB.SQLExec("delete from "+DB.SQLDatabaseReal("eurowinsys","gruposemp")+" where codigo='"+tcGrupo+"'");
1434 
1435  if (_Log)
1436  Guardar_Mensaje("Borrado de grupo de la tabla de control grupos.");
1437  // Borramos el registro de la tabla de control de grupos
1438  //Santi => No usamos la DA pues estamos directamente en la sage.ew.DB
1439  DB.SQLExec("delete from " + DB.SQLDatabaseReal("eurowinsys", "ctrlgrupos") + " where comunes='COMU" + tcGrupo + "'");
1440 
1441  if (_Log)
1442  Guardar_Mensaje("Actualizacion de gruposemp.xml.");
1443 
1444  string lcEuroserv = GrupoempTools._Euroserv.Trim();
1445  DB._GrupoEmpresa_Table2Xml(Path.Combine(lcEuroserv,"gruposemp.xml"));
1446 
1447  if (_Log)
1448  Guardar_Mensaje("Actualizacion de CFGCLISRV.");
1449  GrupoempTools._BorrarGrupo_QuitarGrupo_CfgCliSrv(tcGrupo);
1450 
1451  // PE-105138. Quitar el comunes borrado del diccionario de la DB
1452  if (DB._oAliasDB.ContainsKey("COMU" + tcGrupo.Trim()))
1453  {
1454  DB._oAliasDB.Remove("COMU" + tcGrupo.Trim());
1455  }
1456  }
1457  else
1458  _Error_Message = tcCadenaError;
1459 
1460  // Solo que hay habido un problema con la eliminacion de una de las bases de datos
1461  // ya es razón sufiiente para devolver false
1462 
1463  ActualizarBarraProgreso();
1464 
1465  if (_Log)
1466  CopiarStringLog_Fichero(_RutaFicheroLog);
1467 
1468  ActualizarBarraProgreso();
1469 
1470  return llOk;
1471  }
1472 
1479  public static void CambiarNombreGrupo(string tcGrupo, string tcNombre)
1480  {
1481  string lcSql = "UPDATE " + DB.SQLDatabaseReal("EUROWINSYS", "GRUPOSEMP") + " SET nombre = " + DB.SQLString(tcNombre) + " WHERE codigo = " + DB.SQLString(tcGrupo);
1482  DB.SQLExec(lcSql);
1483  }
1484 
1485  #endregion METODOS PÚBLICOS
1486 
1487 
1488  #region METODOS PRIVADOS
1489 
1495  private static void datosConexionActual(out string tcUsuario, out string tcPassword)
1496  {
1497  // Obtenemos los parámetros actuales de conexión.
1498  //
1499  SqlConnectionStringBuilder loBuilder = new SqlConnectionStringBuilder(DB.Conexion);
1500 
1501  tcUsuario = loBuilder.UserID;
1502  tcPassword = loBuilder.Password;
1503 
1504  return;
1505  }
1506 
1513  private static bool conectarUsuario(string tcUsuario, string tcPass)
1514  {
1515  bool lbOk;
1516 
1517  // Obtenemos los parámetros actuales de conexión
1518  //
1519  SqlConnectionStringBuilder loBuilder = new SqlConnectionStringBuilder(DB.Conexion);
1520 
1521  // Intentamos reconectar con los mismos parámetros cambiando el usuario por sa
1522  //
1523  lbOk = DB.SQLConnect(loBuilder.DataSource, tcComunes: DB.DbComunes, tcUser: tcUsuario, tcPassword: tcPass, tbAuthWin: false);
1524 
1525  return lbOk;
1526  }
1527 
1537  private static bool restoreUsuario(string tcDbNombreViejo, string tcDbNombreNuevo, string tcUsuarioActual, out string tcMsgError, string tcMensalog = "")
1538  {
1539  bool llOk = false;
1540  tcMsgError = "";
1541 
1542  if (_Log)
1543  Guardar_Mensaje("Conectando con usuario 'sa'");
1544 
1545  // Cambiar conexion a usuario sa
1546  //
1547  DB.Error_Message = "";
1548  llOk = conectarUsuario("sa", GrupoempTools._CrearGrupoP);
1549 
1550  if (llOk)
1551  {
1552  if (_Log)
1553  {
1554  Guardar_Mensaje("Conexión con usuario 'sa': OK");
1555  Guardar_Mensaje("Intentando restaurar la base Conexión con usuario 'sa'");
1556  }
1557 
1558  DB.Error_Message = "";
1559  llOk = DB._DbRestore(tcDbNombreViejo, tcDbNombreNuevo, GrupoempTools._CarpetaBackupServidorSql, tcUsuarioActual);
1560  if (llOk)
1561  {
1562  if (_Log)
1563  Guardar_Mensaje("La creación de la nueva base de datos de " + tcMensalog + " " + tcDbNombreNuevo + " se ha realizado correctamente: OK");
1564  }
1565  else
1566  {
1567  tcMsgError = "NO se ha podido restaurar la copia de seguridad de la base de datos de " + tcMensalog + " " +
1568  tcDbNombreViejo + " como " + tcDbNombreNuevo + " utilizando conexión con usuario 'sa', "+
1569  "imposible crear grupo. Error: " + DB.Error_Message;
1570  }
1571  }
1572  else
1573  tcMsgError = "No se ha podido conectar con el usuario 'sa' (" + DB.Error_Message + ").";
1574 
1575  // Si devuelve error el mensaje de error se loguea a la vuelta del procedimiento, en origen.
1576  //
1577 
1578  return llOk;
1579  }
1580 
1586  private static bool borrarBaseDatos(string tcBd)
1587  {
1588  // Mirar si existe base de datos y eliminar
1589  try
1590  {
1591  if (DB._SQLExisteBBDD(tcBd))
1592  DB._DBRemove(new SqlConnection(DB.Conexion), tcBd);
1593  }
1594  catch (Exception loEx)
1595  {
1596  _Error_Message = "Se ha producido un error al eliminar la base de datos " + tcBd
1597  + " ( " + loEx.Message + System.Environment.NewLine + DB.Error_Message + ").";
1598  if (_Log)
1599  Guardar_Mensaje(_Error_Message);
1600 
1601  return true;
1602  }
1603 
1604  return true;
1605  }
1606 
1610  private static void ActualizarBarraProgreso()
1611  {
1612  if (_Worker != null && _TotalPasosProgreso > 0)
1613  {
1614  // Calculamos el progreso relativo a la barra teniendo en cuenta que la barra va de 0 a 100 %
1615  _PasoProgreso++;
1616  int lnProgresoRelativo100 = (_PasoProgreso * 100) / _TotalPasosProgreso;
1617 
1618  if (lnProgresoRelativo100 > 100)
1619  lnProgresoRelativo100 = 100;
1620 
1621  _Worker.ReportProgress(lnProgresoRelativo100);
1622  Application.DoEvents();
1623  }
1624  }
1625 
1632  private static bool CrearGrupo_Comprobar_Existencia_BdNuevas(string tcEjerNuevo, string tcSufijo)
1633  {
1634  string lcBd = tcEjerNuevo + tcSufijo;
1635 
1636 
1637  // Verifico bd. ejercicio del nuevo grupo a crear.
1638  if (DB._SQLExisteBBDD(lcBd))
1639  {
1640  if (GrupoempTools._Log)
1641  GrupoempTools.Guardar_Mensaje("La base de datos " + lcBd + " para el ejercicio a crear en el grupo ya existe en el servidor SQL.");
1642  return true;
1643  }
1644 
1645  // Exigiremos que no exista bd para 15 ejercicios anterior y posteriores con este sufijo
1646  //
1647  int lnEjerNuevo = Convert.ToInt16(tcEjerNuevo);
1648  string lcBdGesIni = Convert.ToString(lnEjerNuevo - 15) + tcSufijo;
1649  string lcBdGesFin = Convert.ToString(lnEjerNuevo + 15) + tcSufijo;
1650  if (GrupoempTools.CrearGrupo_ExistenBdsGestion(lcBdGesIni, lcBdGesFin))
1651  {
1652  if (GrupoempTools._Log)
1653  GrupoempTools.Guardar_Mensaje("La base de datos " + lcBd + " para el ejercicio a crear en el grupo ya está asignada en otra instalación.");
1654 
1655  return true;
1656  }
1657 
1658 
1659 
1660  // Verifico existencia de las bases de datos de los Addons standar a crear en el nuevo grupo
1661  string lcNombreAddon = "";
1662  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrOrigen.Rows)
1663  {
1664  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim().ToUpper();
1665  lcBd = lcNombreAddon.Trim();
1666 
1667  if (lcBd.Length>6)
1668  lcBd = lcBd.Substring(0,6);
1669 
1670  lcBd = lcBd.PadRight(6, '0') + tcSufijo;
1671 
1672  if (DB._SQLExisteBBDD(lcBd))
1673  {
1674  if (GrupoempTools._Log)
1675  GrupoempTools.Guardar_Mensaje("La base de datos " + lcBd + " a crear en el grupo correspondiente al Addon de "+lcNombreAddon+" ya existe en el servidor SQL.");
1676  return true;
1677  }
1678 
1679  }
1680 
1681  return false;
1682  }
1683 
1693  public static bool CrearGrupo_ExistenBdsGestion(string tcNombreBBDDMin, string tcNombreBBDDMax)
1694  {
1695  bool llOk = false;
1696  string lcSql = String.Empty;
1697  DataTable ldtResultado = new DataTable();
1698 
1699  tcNombreBBDDMin = tcNombreBBDDMin.Trim();
1700  tcNombreBBDDMax = tcNombreBBDDMax.Trim();
1701 
1702  if (String.IsNullOrWhiteSpace(tcNombreBBDDMin) || String.IsNullOrWhiteSpace(tcNombreBBDDMax))
1703  return llOk;
1704 
1705  string lcSufijo2Letras = "";
1706 
1707  if (tcNombreBBDDMin.Length == tcNombreBBDDMax.Length)
1708  {
1709  int lnLenNameBd = tcNombreBBDDMin.Length;
1710  lcSufijo2Letras = tcNombreBBDDMin.Substring(lnLenNameBd - 2, 2);
1711  }
1712 
1713  lcSql = "IF EXISTS (SELECT 1 FROM [master].sys.databases " +
1714  " WHERE name >= " + DB.SQLString(tcNombreBBDDMin) + " and name <= " + DB.SQLString(tcNombreBBDDMax) +
1715  " and right(name,2)=" + DB.SQLString(lcSufijo2Letras) + ") " +
1716  " SELECT 1 AS ExisteBBDD ELSE SELECT 0 AS ExisteBBDD ";
1717 
1718  llOk = DB.SQLExec(lcSql, ref ldtResultado);
1719 
1720  if (llOk && ldtResultado.Rows.Count > 0)
1721  llOk = Convert.ToBoolean(ldtResultado.Rows[0]["ExisteBBDD"]);
1722 
1723  return llOk;
1724  }
1725 
1735  private static void Proc_Adicional_ComunesGrNuevo()
1736  {
1737  string lcSql="UPDATE "+DB.SQLDatabaseReal(GrupoempTools._DbComunesGrNuevo,"ejercici")+" SET "+
1738  "RUTA=LEFT(RUTA,4)+'@@', RUTASER=LEFT(RUTASER,4)+'@@', CONEXION=LEFT(CONEXION,4)+'@@'";
1739  DB.SQLExec(lcSql);
1740 
1741  lcSql = "UPDATE " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrNuevo, "modulos") + " SET " +
1742  "NOM_CONEX=LEFT(NOM_CONEX,6)+'@@', TABLAS=LEFT(TABLAS,6)+'@@'";
1743  DB.SQLExec(lcSql);
1744 
1745  return;
1746  }
1747 
1752  private static bool CrearGrupo_RestoreBds()
1753  {
1754  bool llOk = false;
1755 
1756  if (_Log)
1757  Guardar_Mensaje("INICIO PROCESO DE RESTAURACIÓN DE BASES DE DATOS."+Environment.NewLine);
1758 
1759 
1760  // RESTAURACION BD COMUNES CON NUEVO NOMBRE
1761  llOk = GrupoempTools.Restore_Bd(GrupoempTools._DbComunesGrOrigen, GrupoempTools._DbComunesGrNuevo, "COMUNES");
1762  if (!llOk)
1763  return false;
1764 
1765  // En este punto y como medida de seguridad en la bd de COMUNES del grupo nuevo, quitaremos los nombres de las bds de EJERCICIOS
1766  // y ADDONS de COMUNES.EJERCICI y COMUNES.MODULOS pues aun siendo la bd. de COMUNES del nuevo grupo
1767  // en este punto su contenido tiene aún los nombres de las bd del grupo origen.
1768  // Se hace este paso como medida de seguridad por que si por casualidad la creacion de grupo se interrumpiese
1769  // despues de la restauración del COMUNES y antes de restaurar el resto de bases de datos, si algún programador llamase
1770  // al método _Borrar_Grupo() de este grupo que se está creando, acabaría borrando las bds. de ejercicios y
1771  // addons del grupo origen puesto que el contenido de COMUNES.EJERCICI y COMUNES.MODULOS en este punto aún
1772  // apunta a las bds. del grupo origen pues justo acabamos de restaurar la copia con otro nombre !!!!
1773  GrupoempTools.Proc_Adicional_ComunesGrNuevo();
1774 
1775 
1776  // RESTAURACION BD EJERCICIO CON NUEVO NOMBRE
1777  llOk = GrupoempTools.Restore_Bd(GrupoempTools._DbEjerGrOrigen, GrupoempTools._DbEjerGrNuevo, "EJERCICIO");
1778  if (!llOk)
1779  return false;
1780 
1781 
1782 
1783  // RESTAURACION BD DE ADDONS CON NUEVO NOMBRE
1784 
1785  string lcDbAddOnPripal = "", lcNewBdAddon = "", lcNombreAddon="";
1786  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrOrigen.Rows)
1787  {
1788  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim();
1789  lcDbAddOnPripal = Convert.ToString(loRow["nom_conex"]).Trim();
1790 
1791  lcNewBdAddon = lcDbAddOnPripal.Substring(0, lcDbAddOnPripal.Length - 2);
1792  lcNewBdAddon = lcNewBdAddon + GrupoempTools._SufiBdEjerGrNuevo;
1793 
1794  // RESTAURACION BD ADDON CON NUEVO NOMBRE
1795  llOk = GrupoempTools.Restore_Bd(lcDbAddOnPripal, lcNewBdAddon,"el módulo del Add-On de " + lcNombreAddon);
1796  if (!llOk)
1797  return false;
1798  }
1799 
1800 
1801  if (_Log)
1802  {
1803  Guardar_Mensaje("Proceso de restauración de base de datos finalizado correctamente."+Environment.NewLine);
1804  Guardar_Mensaje("FIN PROCESO DE RESTAURACIÓN DE BASES DE DATOS."+Environment.NewLine);
1805  }
1806 
1807  return true;
1808  }
1809 
1814  private static bool CrearGrupo_BorrarBdsNuevas()
1815  {
1816  bool llOk = true;
1817  bool llOk2 = false;
1818 
1819 
1820  // PASO 1/3
1821  // BORRADO DE BASE DE DATOS DE COMUNES DEL NUEVO GRUPO QUE SE PRETENDIA CREAR.
1822 
1823  if (!string.IsNullOrWhiteSpace(GrupoempTools._DbComunesGrNuevo))
1824  {
1825  if (DB._SQLExisteBBDD(GrupoempTools._DbComunesGrNuevo))
1826  {
1827 
1828  if (_Log)
1829  Guardar_Mensaje("Proceso de creación de grupo no se pudo ejecutar correctamente, eliminando base de datos de COMUNES del nuevo grupo que se pretendía crear " + GrupoempTools._DbComunesGrNuevo + " debido a un fallo en el proceso.");
1830 
1831  llOk2 = DB._DBRemove(new SqlConnection(DB.Conexion), GrupoempTools._DbComunesGrNuevo);
1832  llOk = llOk2 && llOk;
1833 
1834  if (_Log)
1835  {
1836  if (llOk2)
1837  Guardar_Mensaje("Base de datos de COMUNES " + GrupoempTools._DbComunesGrNuevo + " eliminada correctamente.");
1838  else
1839  Guardar_Mensaje("Base de datos de COMUNES " + GrupoempTools._DbComunesGrNuevo + " no se pudo eliminar correctamente.");
1840 
1841  }
1842  }
1843  }
1844 
1845 
1846 
1847  // PASO 2/3
1848  // BORRADO DE BASE DE DATOS DE EJERCICIO DEL NUEVO GRUPO QUE SE PRETENDIA CREAR.
1849 
1850  if (!string.IsNullOrWhiteSpace(GrupoempTools._DbEjerGrNuevo))
1851  {
1852  if (DB._SQLExisteBBDD(GrupoempTools._DbEjerGrNuevo))
1853  {
1854  // Borramos la base de datos de EJERCICIOS pues el grupo no se va a crear.
1855  if (_Log)
1856  Guardar_Mensaje("Proceso de creación de grupo no se pudo ejecutar correctamente, eliminando base de datos de EJERCICIO del nuevo grupo que se pretendía crear " + GrupoempTools._DbEjerGrNuevo + " debido a un fallo en el proceso.");
1857 
1858  llOk2 = DB._DBRemove(new SqlConnection(DB.Conexion), GrupoempTools._DbEjerGrNuevo);
1859  llOk = llOk2 && llOk;
1860 
1861  if (_Log)
1862  {
1863  if (llOk2)
1864  Guardar_Mensaje("Base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo + " eliminada correctamente.");
1865  else
1866  Guardar_Mensaje("Base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo + " no se pudo eliminar correctamente.");
1867 
1868  }
1869  }
1870  }
1871 
1872 
1873 
1874 
1875  // PASO 3/3
1876  // BORRADO DE BASE DE DATOS DE ADDONS DEL NUEVO GRUPO QUE SE PRETENDIA CREAR.
1877 
1878  if (GrupoempTools._dtBdAddonsGrNuevo is DataTable && GrupoempTools._dtBdAddonsGrNuevo.Rows.Count > 0)
1879  {
1880  string lcBdAddon = "", lcNombreAddon="";
1881  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrNuevo.Rows)
1882  {
1883  lcBdAddon = Convert.ToString(loRow["nom_conex"]).Trim();
1884  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim();
1885 
1886  if (!string.IsNullOrWhiteSpace(lcBdAddon))
1887  {
1888  if (DB._SQLExisteBBDD(lcBdAddon))
1889  {
1890  // Borramos la base de datos deL AddOn que se había creado pero al fallar la creación del grupo, al final no lo creamos
1891  if (_Log)
1892  Guardar_Mensaje("Proceso de creación de grupo no se pudo ejecutar correctamente, eliminando base de datos del ADDON del "+lcNombreAddon+" " + lcBdAddon + " debido a un fallo en el proceso.");
1893 
1894  llOk2 = DB._DBRemove(new SqlConnection(DB.Conexion), lcBdAddon);
1895  llOk = llOk2 && llOk;
1896 
1897  if (_Log)
1898  {
1899  if (llOk2)
1900  Guardar_Mensaje("Base de datos de AddOn de " + lcNombreAddon + " " + lcBdAddon + " eliminada correctamente.");
1901  else
1902  Guardar_Mensaje("Base de datos de Addon de " + lcNombreAddon + " " + lcBdAddon + " no se pudo eliminar correctamente.");
1903 
1904  }
1905  }
1906 
1907  }
1908  }
1909  }
1910 
1911  // Se intenta eliminar todas las bases de datos del nuevo grupo que se pudiera haber creado hasta el momento en que hubo el error, y devolvemos false caso de que al menos una de ellas no se haya podido
1912  // borrar.
1913 
1914  return llOk;
1915  }
1916 
1917 
1922  private static bool CrearGrupo_BackupsBds()
1923  {
1924  bool llOk = false;
1925 
1926  ActualizarBarraProgreso();
1927 
1928  if (_Log)
1929  Guardar_Mensaje("INICIO PROCESO COPIA DE BASES DE DATOS."+Environment.NewLine);
1930 
1931  // COPIA BASE DE DATOS DE COMUNES DEL grupo origen
1932  llOk = GrupoempTools.Backup_Bd(GrupoempTools._DbComunesGrOrigen, "COMUNES");
1933  ActualizarBarraProgreso();
1934  if (!llOk)
1935  return false;
1936 
1937 
1938  // COPIA BASE DE DATOS DE EJERCICIO DEL grupo origen
1939  llOk = GrupoempTools.Backup_Bd(GrupoempTools._DbEjerGrOrigen, "EJERCICIO");
1940  ActualizarBarraProgreso();
1941  if (!llOk)
1942  return false;
1943 
1944 
1945  // COPIA BASES DE DATOS DE ADDONS BASE DEL grupo origen
1946  string lcBdAddon = "", lcNombreAddon = "";
1947  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrOrigen.Rows)
1948  {
1949  lcBdAddon = Convert.ToString(loRow["nom_conex"]).Trim();
1950  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim().ToUpper();
1951 
1952  llOk = GrupoempTools.Backup_Bd(lcBdAddon, "Add-On " + lcNombreAddon);
1953  if (!llOk)
1954  return false;
1955  }
1956  ActualizarBarraProgreso();
1957 
1958  if (_Log)
1959  {
1960  Guardar_Mensaje("Proceso de copia de bases de datos del grupo origen finalizado correctamente."+Environment.NewLine);
1961  Guardar_Mensaje("FIN PROCESO COPIA DE BASES DE DATOS."+Environment.NewLine);
1962  }
1963  ActualizarBarraProgreso();
1964 
1965  return true;
1966  }
1967 
1972  private static bool CrearEjercicio_CrearTablasBd()
1973  {
1974  bool llOk = false;
1975 
1976  if (_Log)
1977  Guardar_Mensaje("INICIO PROCESO CREACION DE TABLAS EN LA BASES DE DATOS DEL NUEVO EJERCICIO." + Environment.NewLine);
1978 
1979 
1980  // CREACION DE TABLAS EN LA NUEVA BASE DE DATOS EJERCICIO A PARTIR DE LAS TABLAS DEL EJERCICIO ORIGEN
1981  llOk = GrupoempTools.CrearGrupoEjer_CrearTablasBd("GESTION");
1982  if (!llOk)
1983  return false;
1984 
1985  if (_Log)
1986  Guardar_Mensaje("FIN PROCESO CREACION DE TABLAS EN LA BASES DE DATOS DEL NUEVO EJERCICIO." + Environment.NewLine);
1987 
1988  return true;
1989  }
1990 
1995  private static bool CrearEjercicio_CrearBd()
1996  {
1997  bool llOk = false;
1998  string lcSql = "";
1999 
2000 
2001  // CREACION BD GESTION PARA EL NUEVO GRUPO
2002  if (_Log)
2003  Guardar_Mensaje("Creando base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo);
2004 
2005  if (DB._SQLExisteBBDD(_DbEjerGrNuevo))
2006  {
2007  _Error_Message = "La base de datos de EJERCICIO que se pretende crear " + GrupoempTools._DbEjerGrNuevo + " ya existe, imposible crear base de datos de EJERCICIO.";
2008  if (_Log)
2009  Guardar_Mensaje(_Error_Message);
2010  return false;
2011  }
2012 
2013 
2014  llOk = DB._DBCreate(GrupoempTools._DbEjerGrNuevo.Trim());
2015  if (!llOk)
2016  {
2017  _Error_Message = "Se produjo un error al crear la base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo;
2018  if (_Log)
2019  Guardar_Mensaje(_Error_Message);
2020  }
2021  else
2022  {
2023  lcSql = "ALTER AUTHORIZATION ON DATABASE::[" + GrupoempTools._DbEjerGrNuevo + "] TO " + GrupoempTools._UserPropBdGrNuevo;
2024  DB.SQLExec(lcSql);
2025 
2026  if (_Log)
2027  Guardar_Mensaje("Base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo+" creada correctamente.");
2028 
2029  }
2030 
2031  return llOk;
2032  }
2033 
2038  private static bool CrearGrupo_CrearBds()
2039  {
2040  bool llOk = false;
2041  string lcNomBd = "", lcNombreAddon = "", lcSql="";
2042 
2043 
2044  // CREACION BD COMUNES PARA EL NUEVO GRUPO
2045  if (_Log)
2046  Guardar_Mensaje("Creando base de datos de COMUNES " + GrupoempTools._DbComunesGrNuevo);
2047 
2048 
2049  if (DB._SQLExisteBBDD(GrupoempTools._DbComunesGrNuevo.Trim()))
2050  {
2051  _Error_Message = "La base de datos de COMUNES " + GrupoempTools._DbComunesGrNuevo + " ya existe, imposible crear base de datos.";
2052  if (_Log)
2053  Guardar_Mensaje(_Error_Message);
2054  return false;
2055  }
2056 
2057 
2058  llOk = DB._DBCreate(GrupoempTools._DbComunesGrNuevo.Trim());
2059  if (!llOk)
2060  {
2061  _Error_Message = "Se produjo un error al crear la base de datos de COMUNES " + GrupoempTools._DbComunesGrNuevo;
2062  if (_Log)
2063  Guardar_Mensaje(_Error_Message);
2064  }
2065  else
2066  {
2067  lcSql = "ALTER AUTHORIZATION ON DATABASE::[" + GrupoempTools._DbComunesGrNuevo + "] TO " + GrupoempTools._UserPropBdGrNuevo;
2068  DB.SQLExec(lcSql);
2069  }
2070  if (!llOk)
2071  return false;
2072 
2073 
2074 
2075  // CREACION BD GESTION PARA EL NUEVO GRUPO
2076  if (_Log)
2077  Guardar_Mensaje("Creando base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo);
2078 
2079 
2080  if (DB._SQLExisteBBDD(GrupoempTools._DbEjerGrNuevo.Trim()))
2081  {
2082  _Error_Message = "La base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo + " ya existe, imposible crear base de datos.";
2083  if (_Log)
2084  Guardar_Mensaje(_Error_Message);
2085  return false;
2086  }
2087 
2088 
2089  llOk = DB._DBCreate(GrupoempTools._DbEjerGrNuevo.Trim());
2090  if (!llOk)
2091  {
2092  _Error_Message = "Se produjo un error al crear la base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo;
2093  if (_Log)
2094  Guardar_Mensaje(_Error_Message);
2095  }
2096  else
2097  {
2098  lcSql = "ALTER AUTHORIZATION ON DATABASE::[" + GrupoempTools._DbEjerGrNuevo + "] TO " + GrupoempTools._UserPropBdGrNuevo;
2099  DB.SQLExec(lcSql);
2100 
2101  }
2102  if (!llOk)
2103  return false;
2104 
2105 
2106 
2107 
2108  // CREACION BD DE ADDONS PARA EL NUEVO GRUPO
2109  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrNuevo.Rows)
2110  {
2111  lcNomBd = Convert.ToString(loRow["nom_conex"]).Trim();
2112  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim();
2113 
2114  if (_Log)
2115  Guardar_Mensaje("Creando base de datos de ADDON " + lcNombreAddon+" "+lcNomBd);
2116 
2117 
2118  if (DB._SQLExisteBBDD(lcNomBd))
2119  {
2120  _Error_Message = "La base de datos de ADDON " + lcNombreAddon + " " + lcNomBd + " ya existe, imposible crear base de datos.";
2121  if (_Log)
2122  Guardar_Mensaje(_Error_Message);
2123  return false;
2124  }
2125 
2126 
2127  llOk = DB._DBCreate(lcNomBd);
2128  if (!llOk)
2129  {
2130  _Error_Message = "Se produjo un error al crear la base de datos del ADDON " + lcNombreAddon + " " + lcNomBd;
2131  if (_Log)
2132  Guardar_Mensaje(_Error_Message);
2133  }
2134  else
2135  {
2136  lcSql = "ALTER AUTHORIZATION ON DATABASE::[" + lcNomBd + "] TO " + GrupoempTools._UserPropBdGrNuevo;
2137  DB.SQLExec(lcSql);
2138  }
2139  if (!llOk)
2140  return false;
2141  }
2142 
2143  return true;
2144  }
2145 
2146 
2156  private static bool CrearGrupoEjer_CrearIndices_ValsDefecto_Tabla(string tcBdOrigen, string tcBdNueva, string tcTabla, DataTable tdtIndices, DataTable tdtValsDefecto)
2157  {
2158  bool llOk = false, llEsPrimario=false;
2159  string lcSql = "", lcNombreIndice ="", lcExpresionIndice="", lcNombreConstraintValDef="", lcValorDefecto="", lcCampoDefecto="", lcFiltroTabla="", lcTabla="";
2160 
2161  tcTabla = tcTabla.ToLower().Trim();
2162  tcBdNueva = tcBdNueva.ToLower().Trim();
2163  tcBdOrigen = tcBdOrigen.ToLower().Trim();
2164 
2165 
2166  // CREAR CLAVE PRIMARIA Y VALORES POR DEFECTO PARA LA NUEVA TABLA ...
2167 
2168  //Revisar si tenemos de filtrar por tabla
2169  lcFiltroTabla = !string.IsNullOrEmpty(tcTabla.Trim()) ? "tabla='" + tcTabla + "'" : "";
2170 
2171  DataRow[] laRows = tdtIndices.Select(lcFiltroTabla, "tabla, indice asc, indice_orden asc"); // Hay una fila para cada columna que interviene en un índice de la tabla
2172  int ln_i=0;
2173 
2174  while (ln_i<laRows.GetLength(0))
2175  {
2176  lcNombreIndice = Convert.ToString(laRows[ln_i]["indice"]).Trim();
2177  llEsPrimario = Convert.ToBoolean(laRows[ln_i]["indice_primario"]);
2178  lcTabla = Convert.ToString(laRows[ln_i]["tabla"]).Trim();
2179 
2180  lcExpresionIndice = "";
2181  while (ln_i<laRows.GetLength(0) && Convert.ToString(laRows[ln_i]["indice"]).Trim() == lcNombreIndice)
2182  {
2183  lcExpresionIndice += " ["+Convert.ToString(laRows[ln_i]["columna"]).Trim()+"] ASC, ";
2184  ln_i++;
2185  }
2186  if (!string.IsNullOrWhiteSpace(lcExpresionIndice))
2187  {
2188  lcExpresionIndice = lcExpresionIndice.Trim();
2189  lcExpresionIndice = lcExpresionIndice.Substring(0, lcExpresionIndice.Length - 1);
2190  }
2191 
2192  if (llEsPrimario)
2193  {
2194  //lcNombreIndice = lcNombreIndice.Replace(tcBdOrigen,tcBdNueva); // En el nombre del índice primario aparece el nombre de la bd.
2195  lcNombreIndice = Regex.Replace(lcNombreIndice, tcBdOrigen, tcBdNueva, RegexOptions.IgnoreCase); //CCR 170491
2196  lcSql += " ALTER TABLE [" + tcBdNueva + "].[dbo].[" + lcTabla + "] ADD CONSTRAINT [" + lcNombreIndice + "] " +
2197  " PRIMARY KEY CLUSTERED ( "+lcExpresionIndice+") WITH ( STATISTICS_NORECOMPUTE = OFF, "+
2198  " IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [eurowind]; ";
2199  }
2200  else
2201  {
2202  lcSql += "CREATE NONCLUSTERED INDEX [" + lcNombreIndice + "] ON [" + tcBdNueva + "].[dbo].[" + lcTabla + "] " +
2203  "("+lcExpresionIndice+") WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, "+
2204  "IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [eurowini]; ";
2205  }
2206  }
2207 
2208  // Ejecutar instrucción para crear todos los indices, clave primaria incluida, todo en una unica instruccion, controlo que haya algo que hacer pues caso de una tabla sin indices ni clave primaria
2209  // aqui no deberia haber nada.
2210  if (!string.IsNullOrWhiteSpace(lcSql))
2211  {
2212  llOk = DB.SQLExec(lcSql);
2213  if (!llOk)
2214  {
2215  if (string.IsNullOrEmpty(tcTabla))
2216  _Error_Message = "Error al crear los índices de la base de datos " + tcBdNueva;
2217  else
2218  _Error_Message = "Error al crear los índices para la tabla " + tcTabla + " de la base de datos " + tcBdNueva;
2219  if (_Log)
2220  Guardar_Mensaje(_Error_Message);
2221  return false;
2222  }
2223  }
2224 
2225 
2226  // CREAR VALORES POR DEFECTO PARA LA NUEVA TABLA ...
2227 
2228  laRows = tdtValsDefecto.Select(lcFiltroTabla); // Hay una fila para cada columna que interviene en un índice de la tabla
2229  ln_i=0;
2230  lcSql="";
2231  foreach (DataRow loRow in laRows)
2232  {
2233  lcNombreConstraintValDef = Convert.ToString(loRow["constr_nombre"]).Trim();
2234  lcValorDefecto = Convert.ToString(loRow["constr_defin"]).Trim();
2235  lcCampoDefecto = Convert.ToString(loRow["campo"]).Trim();
2236  lcTabla = Convert.ToString(loRow["tabla"]).Trim();
2237 
2238  //lcNombreConstraintValDef = lcNombreConstraintValDef.Replace(tcBdOrigen,tcBdNueva); // En el nombre de la constraint aparece el nombre de la bd.
2239  lcNombreConstraintValDef = Regex.Replace(lcNombreConstraintValDef, tcBdOrigen, tcBdNueva, RegexOptions.IgnoreCase); //CCR 170491
2240 
2241  lcSql += " ALTER TABLE [" + tcBdNueva + "].[dbo].[" + lcTabla + "] ADD CONSTRAINT [" + lcNombreConstraintValDef + "] " +
2242  " DEFAULT ("+lcValorDefecto+") FOR ["+lcCampoDefecto+"]; ";
2243  }
2244 
2245  if (!string.IsNullOrWhiteSpace(lcSql)) // Esto debería cumplirse siempre pero por si acaso.
2246  {
2247  // Ejecutar instrucción para crear todas las constraints de valores por defecto.
2248  llOk = DB.SQLExec(lcSql);
2249 
2250  if (!llOk)
2251  {
2252  if (string.IsNullOrEmpty(tcTabla))
2253  _Error_Message = "Error al crear los valores por defecto de la base de datos " + tcBdNueva;
2254  else
2255  _Error_Message = "Error al crear los valores por defecto para la tabla " + tcTabla + " de la base de datos " + tcBdNueva;
2256  if (_Log)
2257  Guardar_Mensaje(_Error_Message);
2258  return false;
2259  }
2260  }
2261 
2262 
2263 
2264 
2265  // GENERAR LA CLAVE PRIMARIA, AUTOMATICAMENTE APARECERA TAMBIEN UN INDICE COMO ESTE
2266  //
2267  //
2268  // ALTER TABLE [2007NA].[dbo].[C_ALBVEN] ADD CONSTRAINT [pk__2006na__c_albven__empnumlet]
2269  // PRIMARY KEY CLUSTERED ( [EMPRESA] ASC, [NUMERO] ASC, [LETRA] ASC)
2270  // WITH ( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
2271  // ON [eurowind]
2272 
2273 
2274 
2275  // GENERAR EL RESTO DE INDICES QUE NO SON CLAVE PRIMARIA
2276  //
2277  //
2278  // CREATE NONCLUSTERED INDEX [empcli] ON [2007NA].[DBO].[C_ALBVEN]
2279  // ([EMPRESA] ASC, [CLIENTE] ASC, [NUMERO] ASC, [LETRA] ASC)
2280  // WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [eurowini]
2281 
2282 
2283 
2284  // GENERAR CONSTRAINT DE VALOR POR DEFECTO DE CAMPO
2285  // ALTER TABLE [2017VO].dbo].[c_comuni] ADD CONSTRAINT [df__2017vo__c_comuni__empresa] DEFAULT ('') FOR [EMPRESA]
2286 
2287  //
2288  // OJO QUE SI SE CREAN LAS TABLAS MEDIANTE SELECT * INTO [newbd].dboi.tabla from [actbd].dbo.tabla la crea en el gurpo de archivo PRIMARY y no en [eurowind], ver que trascendencia podria tener.
2289 
2290  return true;
2291 
2292  }
2293 
2294 
2304  private static bool CrearGrupoEjer_EliminarIndices_ValsDefecto_Tabla(string tcBdOrigen, string tcBdNueva, string tcTabla, DataTable tdtIndices, DataTable tdtValsDefecto)
2305  {
2306  bool llOk = false, llEsPrimario = false;
2307  string lcSql = "", lcNombreIndice = "", lcNombreConstraintValDef = "", lcValorDefecto = "", lcCampoDefecto = "", lcTabla = "", lcFiltroTabla = "";
2308 
2309  tcTabla = tcTabla.ToLower().Trim();
2310  tcBdNueva = tcBdNueva.ToLower().Trim();
2311  tcBdOrigen = tcBdOrigen.ToLower().Trim();
2312 
2313 
2314  // ELIMINAR CLAVE PRIMARIA Y VALORES POR DEFECTO PARA LA NUEVA TABLA ...
2315  lcFiltroTabla = !string.IsNullOrEmpty(tcTabla.Trim()) ? "tabla='" + tcTabla + "'" : "";
2316 
2317  // En la tabla de índices tenemos tantos registros de un índice como campos componen el índice y nos interesa tener un registro por tabla e índice
2318  DataView dtView = new DataView(tdtIndices);
2319  DataTable dtDistinctValues = dtView.ToTable(true, "tabla", "indice", "indice_primario");
2320  DataRow[] laRows = dtDistinctValues.Select(lcFiltroTabla, "tabla, indice asc");
2321 
2322  foreach (DataRow loRow in laRows)
2323  {
2324  llEsPrimario = Convert.ToBoolean(loRow["indice_primario"]);
2325  lcNombreIndice = Convert.ToString(loRow["indice"]).Trim();
2326  lcTabla = Convert.ToString(loRow["tabla"]).Trim();
2327 
2328  if (llEsPrimario)
2329  {
2330  lcNombreIndice = lcNombreIndice.Replace(tcBdOrigen, tcBdNueva); // En el nombre del índice pirmario aparece el nombre de la bd.
2331  lcSql = lcSql + "ALTER TABLE [" + tcBdNueva + "].[dbo].[" + lcTabla + "] DROP CONSTRAINT [" + lcNombreIndice + "]; ";
2332  }
2333  else
2334  {
2335  lcSql = lcSql + "DROP INDEX [" + lcNombreIndice + "] ON [" + tcBdNueva + "].[dbo].[" + lcTabla + "]; ";
2336  }
2337  }
2338 
2339  // Ejecutar instrucción para crear todos los indices, clave primaria incluida, todo en una unica instruccion, controlo que haya algo que hacer pues caso de una tabla sin indices ni clave primaria
2340  // aqui no deberia haber nada.
2341  if (!string.IsNullOrWhiteSpace(lcSql))
2342  {
2343  llOk = DB.SQLExec(lcSql);
2344  if (!llOk)
2345  {
2346  if (string.IsNullOrEmpty(tcTabla))
2347  _Error_Message = "Error al eliminar los índices de la base de datos " + tcBdNueva;
2348  else
2349  _Error_Message = "Error al eliminar los índices para la tabla " + tcTabla + " de la base de datos " + tcBdNueva;
2350  if (_Log)
2351  Guardar_Mensaje(_Error_Message);
2352  return false;
2353  }
2354  }
2355 
2356 
2357  // ELIMINAR VALORES POR DEFECTO PARA LA NUEVA TABLA ...
2358 
2359  laRows = tdtValsDefecto.Select(lcFiltroTabla);
2360  lcSql = "";
2361  foreach (DataRow loRow in laRows)
2362  {
2363  lcNombreConstraintValDef = Convert.ToString(loRow["constr_nombre"]).Trim();
2364  lcValorDefecto = Convert.ToString(loRow["constr_defin"]).Trim();
2365  lcCampoDefecto = Convert.ToString(loRow["campo"]).Trim();
2366  lcTabla = Convert.ToString(loRow["tabla"]).Trim();
2367 
2368  lcNombreConstraintValDef = lcNombreConstraintValDef.Replace(tcBdOrigen, tcBdNueva); // En el nombre de la constraint aparece el nombre de la bd.
2369 
2370  lcSql += " ALTER TABLE [" + tcBdNueva + "].[dbo].[" + lcTabla + "] DROP CONSTRAINT [" + lcNombreConstraintValDef + "] ; ";
2371  }
2372 
2373  if (!string.IsNullOrWhiteSpace(lcSql)) // Esto debería cumplirse siempre pero por si acaso.
2374  {
2375  // Ejecutar instrucción para crear todas las constraints de valores por defecto.
2376  llOk = DB.SQLExec(lcSql);
2377 
2378  if (!llOk)
2379  {
2380  if (string.IsNullOrEmpty(tcTabla))
2381  _Error_Message = "Error al eliminar los valores por defecto de la base de datos " + tcBdNueva;
2382  else
2383  _Error_Message = "Error al eliminar los valores por defecto para la tabla " + tcTabla + " de la base de datos " + tcBdNueva;
2384  if (_Log)
2385  Guardar_Mensaje(_Error_Message);
2386  return false;
2387  }
2388  }
2389 
2390  return true;
2391 
2392  }
2393 
2402  private static bool CrearGrupoEjer_Actualizar_Indices(string tcBdOrigen, string tcBdNueva, string tcTabla, DataTable tdtIndices)
2403  {
2404  bool llOk = false;
2405  string lcSql = "", lcNombreIndice = "", lcFiltro = "", lcNombreIndiceNuevo = "";
2406 
2407  tcTabla = tcTabla.ToLower().Trim();
2408  tcBdNueva = tcBdNueva.ToLower().Trim();
2409  tcBdOrigen = tcBdOrigen.ToLower().Trim();
2410 
2411 
2412  // RENOMBRAR CLAVE PRIMARIA ...
2413 
2414  // filtro por indice primario y tabla si existe
2415  lcFiltro = "indice_primario " + (!string.IsNullOrEmpty(tcTabla.Trim()) ? " and tabla='" + tcTabla + "'" : "");
2416 
2417  // En la tabla de índices tenemos tantos registros de un índice como campos componen el índice y nos interesa tener un registro por tabla e índice
2418  DataView dtView = new DataView(tdtIndices);
2419  DataTable dtDistinctValues = dtView.ToTable(true, "tabla", "indice", "indice_primario");
2420  DataRow[] laRows = dtDistinctValues.Select(lcFiltro, "tabla, indice asc");
2421 
2422  foreach (DataRow loRow in laRows)
2423  {
2424  lcNombreIndice = Convert.ToString(loRow["indice"]).Trim();
2425 
2426  //lcNombreIndiceNuevo = lcNombreIndice.Replace(tcBdOrigen, tcBdNueva);
2427  lcNombreIndiceNuevo = Regex.Replace(lcNombreIndice, tcBdOrigen, tcBdNueva, RegexOptions.IgnoreCase); //CCR 170491
2428 
2429  lcSql = lcSql + " exec sp_rename '" + lcNombreIndice + "', '" + lcNombreIndiceNuevo + "', 'object'";
2430  }
2431 
2432  // Ejecutar instrucción para renombrar los nombres de las claves primarias
2433  if (!string.IsNullOrWhiteSpace(lcSql))
2434  {
2435  lcSql = "use [" + tcBdNueva + "]; " + lcSql;
2436 
2437  llOk = DB.SQLExec(lcSql);
2438  if (!llOk)
2439  {
2440  if (string.IsNullOrEmpty(tcTabla))
2441  _Error_Message = "Error al renombrar los índices de la base de datos " + tcBdNueva;
2442  else
2443  _Error_Message = "Error al renombrar los índices para la tabla " + tcTabla + " de la base de datos " + tcBdNueva;
2444  if (_Log)
2445  Guardar_Mensaje(_Error_Message);
2446  return false;
2447  }
2448  }
2449 
2450  return true;
2451 
2452  }
2453 
2454 
2463  private static bool CrearGrupoEjer_Actualizar_ValoresDefecto(string tcBdOrigen, string tcBdNueva, string tcTabla, DataTable tdtValsDefecto)
2464  {
2465  bool llOk = false;
2466  string lcSql = "", lcNombreConstraintValDef = "", lcFiltroTabla = "", lcNombreConstraintNuevo = "";
2467 
2468  tcTabla = tcTabla.ToLower().Trim();
2469  tcBdNueva = tcBdNueva.ToLower().Trim();
2470  tcBdOrigen = tcBdOrigen.ToLower().Trim();
2471 
2472  // CAMBIAR EL NOMBRE DE LOS VALORES POR DEFECTO
2473 
2474  // filtrar por tabla
2475  lcFiltroTabla = !string.IsNullOrEmpty(tcTabla.Trim()) ? "tabla='" + tcTabla + "'" : "";
2476 
2477  DataRow[] laRows = tdtValsDefecto.Select(lcFiltroTabla);
2478 
2479  // Montar instrucción para hacer el cambio en una sola instrucción
2480  foreach (DataRow loRow in laRows)
2481  {
2482  lcNombreConstraintValDef = Convert.ToString(loRow["constr_nombre"]).Trim();
2483 
2484  // Actualizar el nombre
2485  //lcNombreConstraintNuevo = lcNombreConstraintValDef.Replace(tcBdOrigen, tcBdNueva);
2486  lcNombreConstraintNuevo = Regex.Replace(lcNombreConstraintValDef, tcBdOrigen, tcBdNueva, RegexOptions.IgnoreCase); //CCR 170491
2487 
2488  lcSql = lcSql + " exec sp_rename '" + lcNombreConstraintValDef + "', '" + lcNombreConstraintNuevo + "', 'object'";
2489  }
2490 
2491 
2492  // Ejecutar instrucción para cambiar todos los valores por defecto
2493  if (!string.IsNullOrWhiteSpace(lcSql))
2494  {
2495  lcSql = "use [" + tcBdNueva + "]; " + lcSql;
2496 
2497  llOk = DB.SQLExec(lcSql);
2498  if (!llOk)
2499  {
2500  if (string.IsNullOrEmpty(tcTabla))
2501  _Error_Message = "Error al renombrar los valores por defecto de la base de datos " + tcBdNueva;
2502  else
2503  _Error_Message = "Error al renombrar los valores por defecto para la tabla " + tcTabla + " de la base de datos " + tcBdNueva;
2504  if (_Log)
2505  Guardar_Mensaje(_Error_Message);
2506  return false;
2507  }
2508  }
2509 
2510  return true;
2511  }
2512 
2513 
2514 
2523  private static bool CrearGrupoEjer_CrearTablasBd(string tcTipoBd, string tcNombreAddon="", string tcBdAddonOri="", string tcBdAddonNuevo="")
2524  {
2525  bool llOk = false;
2526 
2527  string lcSql = "", lcTabla = "";
2528  string lcBdOrigen="", lcBdNueva = "";
2529 
2530  switch (tcTipoBd)
2531  {
2532  case "COMUNES":
2533  lcBdOrigen = GrupoempTools._DbComunesGrOrigen;
2534  lcBdNueva = GrupoempTools._DbComunesGrNuevo;
2535  break;
2536  case "GESTION":
2537  lcBdOrigen = GrupoempTools._DbEjerGrOrigen;
2538  lcBdNueva = GrupoempTools._DbEjerGrNuevo;
2539  break;
2540  case "ADDON":
2541  lcBdOrigen = tcBdAddonOri;
2542  lcBdNueva = tcBdAddonNuevo;
2543  break;
2544  }
2545 
2546  // En la tabla COMUNES!TABSYS guardamos las tablas de COMUNES y GESTION que son de sistema y no deben borrarse, por tanto en el nuevo grupo se respetará su contenido
2547  // En el caso de los Addons tambien existe la tabla TABSYS. De momento Sage50 instala 5 addons de forma predeterminada aunque no tienen por estar visibles (TPV, AMORTIZA, MAYORIST, LOTES, INFORAUT)
2548 
2549  // El proceso de creación de tablas revisa todas las tablas de la base de datos y si la detectada en la lista de tabla que no deben borrarse la deja igual, y si detecta que está en la lista
2550  // de tablas a las que hay que aplicar algún proceso, la procesa.
2551 
2552  if (_Log)
2553  Guardar_Mensaje("INICIO PROCESO DE CREACION DE TABLAS EN LA BASE DE DATOS DE " + tcTipoBd + " [" + lcBdNueva + "] " + tcNombreAddon + Environment.NewLine);
2554 
2555 
2556 
2557 
2558  // TABLAS DE SISTEMA QUE NO DEBEN BORRARSE, CONSULTAR TABSYS
2559  DataTable ldtTablasNoborr = new DataTable();
2560  lcSql = "select tabla from " + DB.SQLDatabaseReal(tcTipoBd == "COMUNES" || tcTipoBd == "GESTION" ? _DbComunesGrOrigen : tcBdAddonOri, "tabsys") + " " +
2561  (tcTipoBd == "COMUNES" || tcTipoBd == "GESTION" ? "where basedatos='" + tcTipoBd + "'" : "");
2562  DB.SQLExec(lcSql, ref ldtTablasNoborr);
2563  List<string> lstTablasNoBorr = ldtTablasNoborr.AsEnumerable().Select(x => x[0].ToString().Trim().ToUpper()).ToList();
2564 
2565  if (_Log)
2566  Guardar_Mensaje("Detectadas " + lstTablasNoBorr.Count.ToString() + " tablas de sistema en la base de datos de " + tcTipoBd + " (" + lcBdOrigen + ")" + tcNombreAddon + " cuyo contenido no debe borrarse.");
2567 
2568 
2569 
2570 
2571  // TABLAS CON ALGUN TRATAMIENTO ESPECIAL A REALIZAR
2572 
2573  // Tratamientos: eliminar registros de empresas sobrantes, eliminar registros de usuarios diferentes de SUPERVISOR,
2574  // poner contadores a 0
2575  List<string> lstTablasEspeciales = null;
2576 
2577  lstTablasEspeciales = GrupoempTools.CrearGrupoEjer_Tablas_Especiales(tcTipoBd, tcNombreAddon);
2578 
2579  // Cualquier tabla que esté en cualquiera de las dos listas anteriores (lstTablasNoBorr, lstTablasEspeciales) no se borrará.
2580 
2581 
2582 
2583  // OBTENER TODAS LAS TABLAS DE LA BASE DE DATOS
2584  if (_Log)
2585  Guardar_Mensaje("Consultando tablas existentes en la base de datos de " + tcTipoBd + " " + tcNombreAddon + " " + lcBdOrigen);
2586 
2587  DataTable ldtTablasBd = new DataTable();
2588  try
2589  {
2590  lcSql = "SELECT table_name as tabla " +
2591  "FROM [" + lcBdOrigen + "].INFORMATION_SCHEMA.TABLES " +
2592  "ORDER BY table_name ";
2593  DB.SQLExec(lcSql, ref ldtTablasBd);
2594  }
2595  catch (Exception loEx)
2596  {
2597  _Error_Message = "No se puedieron obtener las tablas existentes en la base de datos de " + tcTipoBd + " " + lcBdOrigen;
2598  if (_Log)
2599  {
2600  Guardar_Mensaje(_Error_Message);
2601  Guardar_Mensaje(loEx.Message);
2602  }
2603  return false;
2604  }
2605 
2606 
2607 
2608 
2609  // PROCESAR CADA UNA DE LAS TABLAS DE LA BASE DE DATOS ORIGEN PARA CREAR LA CORRESPONDIENTE EN LA BD DESTINO
2610 
2611  // Obtener en un DataTable los indices de las tablas de la base de datos origen, los utilizaremos para crear los indices en las tablas de la bd. destino
2612  DataTable ldtIndicesBdOri = new DataTable();
2613  llOk = DB._DbIndicesCampos(lcBdOrigen, ref ldtIndicesBdOri);
2614  if (!llOk)
2615  {
2616  _Error_Message = "No se pudieron obtener los índices de las tablas de la base de datos de " + tcTipoBd + " " + lcBdOrigen;
2617  if (_Log)
2618  Guardar_Mensaje(_Error_Message);
2619  return false;
2620  }
2621 
2622 
2623  // Obtener en un DataTable los valores por defecto de las tablas de la base de datos origen, los utilizaremos para crear los valores por defecto en las tablas de la bd. destino
2624  DataTable ldtValsDefecto = new DataTable();
2625  llOk = DB._DbValoresDefectoCampos(lcBdOrigen, ref ldtValsDefecto);
2626  if (!llOk)
2627  {
2628  _Error_Message = "No se pudieron obtener los valores por defecto de las tablas de la base de datos de " + tcTipoBd + " " + lcBdOrigen;
2629  if (_Log)
2630  Guardar_Mensaje(_Error_Message);
2631  return false;
2632  }
2633 
2634 
2635 
2636  // Nos recorremos las tablas de la base de datos y si la tabla en questión no está ni en la lista de tablas no borrables,
2637  // ni está en la lista de tablas a la que realizar algún proceso, la creamos vacía
2638  bool llConDatos = true;
2639  foreach (DataRow loRow in ldtTablasBd.Rows)
2640  {
2641  lcTabla = Convert.ToString(loRow["tabla"]).Trim().ToUpper();
2642 
2643  llConDatos = lstTablasNoBorr.Contains(lcTabla) || (lstTablasEspeciales != null ? lstTablasEspeciales.Contains(lcTabla) : false);
2644 
2645  if (_Log)
2646  Guardar_Mensaje("Creando tabla " + (llConDatos ? "con datos" : "sin datos") + lcBdNueva + "." + lcTabla);
2647 
2648  // Creo la tabla en la nueva base de datos a partir de la tabla del mismo nombre en el grupo origen
2649  try
2650  {
2651  DB.SQLExec("select "+ (llConDatos==false ? " top 0 " : "")+" * into " + DB.SQLDatabaseReal(lcBdNueva, lcTabla.ToLower()) + " from " + DB.SQLDatabaseReal(lcBdOrigen, lcTabla));
2652  }
2653  catch (Exception loEx)
2654  {
2655  _Error_Message = "No se pudo crear la tabla "+lcTabla+" "+ ( llConDatos ? "con datos " : "sin datos ")+" en la base de datos "+ lcBdNueva +
2656  " a partir de la tabla " +lcTabla+" de la base de datos "+lcBdOrigen;
2657  if (_Log)
2658  {
2659  Guardar_Mensaje(_Error_Message);
2660  Guardar_Mensaje(loEx.Message);
2661  }
2662  return false;
2663  }
2664 
2665  // Creo los índices primarios y secundarios y todas las constraints de valores por defecto de la tabla.
2666  llOk = GrupoempTools.CrearGrupoEjer_CrearIndices_ValsDefecto_Tabla(lcBdOrigen,lcBdNueva, lcTabla, ldtIndicesBdOri, ldtValsDefecto); // Pasamos también la bd origen pues en el nombre del indice primario y de las constraints de valor defecto aparece este nombre y hay que cambiarlo por la nueva bd.
2667 
2668  if (!llOk)
2669  {
2670  _Error_Message = "No se pudiero crear los índices y asignar los valores por defecto correspondientes en la tabla de la base de datos de " + tcTipoBd + " " + lcBdNueva + " " + lcTabla;
2671  if (_Log)
2672  Guardar_Mensaje(_Error_Message);
2673  return false;
2674  }
2675  }
2676 
2677  if (_Log)
2678  {
2679  Guardar_Mensaje(Environment.NewLine);
2680  Guardar_Mensaje("FIN PROCESO DE CREACION DE TABLAS EN LA BASE DE DATOS DE " + tcTipoBd + " [" + lcBdNueva + "] " + tcNombreAddon + Environment.NewLine);
2681  }
2682 
2683 
2684  return true;
2685  }
2686 
2691  private static bool CrearGrupo_CrearTablasBds()
2692  {
2693  bool llOk = false;
2694 
2695  ActualizarBarraProgreso();
2696 
2697  if (_Log)
2698  Guardar_Mensaje("INICIO PROCESO CREACION DE TABLAS EN LAS BASES DE DATOS DEL NUEVO GRUPO." + Environment.NewLine);
2699 
2700 
2701  // CREACION DE TABLAS EN LA NUEVA BASE DE DATOS COMUNES DEL NUEVO GRUPO A PARTIR DE LAS TABLAS DE COMUNES DEL GRUPO ORIGEN
2702  llOk = GrupoempTools.CrearGrupoEjer_CrearTablasBd("COMUNES");
2703  ActualizarBarraProgreso();
2704  if (!llOk)
2705  return false;
2706 
2707 
2708  // CREACION DE TABLAS EN LA NUEVA BASE DE DATOS EJERCICIO DEL NUEVO GRUPO A PARTIR DE LAS TABLAS DE EJERCICIO DEL GRUPO ORIGEN
2709  llOk = llOk && GrupoempTools.CrearGrupoEjer_CrearTablasBd("GESTION");
2710  ActualizarBarraProgreso();
2711  if (!llOk)
2712  return false;
2713 
2714 
2715  // CREACION DE TABLAS EN LAS NUEVAS BASES DE DATOS DE ADDONS DEL NUEVO GRUPO A PARTIR DE LAS TABLAS DEL ADDON DEL GRUPO ORIGEN
2716  string lcNombreAddon = "", lcNewBdAddon = "", lcSufijoGrOrigen="",lcOriBdAddon="";
2717  lcSufijoGrOrigen = GrupoempTools._DbEjerGrOrigen.Trim().Substring(4,2);
2718  foreach (DataRow loRow in _dtBdAddonsGrNuevo.Rows)
2719  {
2720  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim().ToUpper();
2721  lcNewBdAddon = Convert.ToString(loRow["nom_conex"]).Trim();
2722 
2723  lcOriBdAddon = lcNewBdAddon.Substring(0,6)+lcSufijoGrOrigen;
2724 
2725  // CREACION DE TABLAS EN LA NUEVA BASE DE DATOS DE ADDONS DEL NUEVO GRUPO
2726  llOk = GrupoempTools.CrearGrupoEjer_CrearTablasBd("ADDON", lcNombreAddon, lcOriBdAddon, lcNewBdAddon);
2727  if (!llOk)
2728  return false;
2729  }
2730  ActualizarBarraProgreso();
2731 
2732  if (_Log)
2733  Guardar_Mensaje("FIN PROCESO CREACION DE TABLAS EN LAS BASES DE DATOS DEL NUEVO GRUPO." + Environment.NewLine);
2734 
2735  ActualizarBarraProgreso();
2736 
2737  return true;
2738  }
2739 
2740 
2745  private static bool CrearGrupo_AjustarDatosBds()
2746  {
2747  bool llOk = false;
2748  string lcOrigenBdAddon = string.Empty;
2749 
2750  ActualizarBarraProgreso();
2751 
2752  if (_Log)
2753  Guardar_Mensaje("INICIO PROCESO AJUSTE DE DATOS EN LAS BASES DE DATOS DEL NUEVO GRUPO."+Environment.NewLine);
2754 
2755 
2756  // AJUSTES EN NUEVA BASE DE DATOS COMUNES DE NUEVO GRUPO
2757  llOk = GrupoempTools.AjustarDatos_Bd(_DbComunesGrNuevo, "COMUNES");
2758  ActualizarBarraProgreso();
2759  if (!llOk)
2760  return false;
2761 
2762  // Eliminar y crear las claves primarias y valores por defecto
2763  llOk = Restore_Indices_ValoresDefecto(_DbComunesGrOrigen, _DbComunesGrNuevo);
2764  ActualizarBarraProgreso();
2765  if (!llOk)
2766  return false;
2767 
2768 
2769  // AJUSTES EN NUEVA BASE DE DATOS EJERCICIO DEL NUEVO GRUPO
2770  llOk = llOk && GrupoempTools.AjustarDatos_Bd(_DbEjerGrNuevo, "GESTION");
2771  ActualizarBarraProgreso();
2772  if (!llOk)
2773  return false;
2774 
2775  // Eliminar y crear las claves primarias y valores por defecto
2776  llOk = Restore_Indices_ValoresDefecto(_DbEjerGrOrigen, _DbEjerGrNuevo);
2777  ActualizarBarraProgreso();
2778  if (!llOk)
2779  return false;
2780 
2781 
2782  // AJUSTES EN NUEVA BASE DE DATOS DE ADDONS DEL NUEVO GRUPO
2783  string lcNombreAddon = "", lcNewBdAddon = "";
2784  foreach (DataRow loRow in _dtBdAddonsGrNuevo.Rows)
2785  {
2786  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim().ToUpper();
2787  lcNewBdAddon = Convert.ToString(loRow["nom_conex"]).Trim();
2788 
2789  // AJUSTES EN NUEVA BASE DE DATOS DE ADDON
2790  llOk = GrupoempTools.AjustarDatos_Bd(lcNewBdAddon, "ADDON", lcNombreAddon);
2791  if (!llOk)
2792  return false;
2793 
2794  // Obtener el nombre anterior de la base de datos del addon
2795  DataRow [] loRowViejo = _dtBdAddonsGrOrigen.Select("nombre = '" + lcNombreAddon + "'");
2796  if (loRowViejo.Count() > 0)
2797  {
2798  lcOrigenBdAddon = Convert.ToString(loRowViejo[0]["nom_conex"]).Trim();
2799 
2800  if (!string.IsNullOrEmpty(lcOrigenBdAddon))
2801  {
2802  // Eliminar y crear las claves primarias y valores por defecto
2803  llOk = Restore_Indices_ValoresDefecto(lcOrigenBdAddon, lcNewBdAddon);
2804  if (!llOk)
2805  return false;
2806  }
2807  }
2808  }
2809  ActualizarBarraProgreso();
2810 
2811  // Si se ha configurado el nuevo grupo para utilizar las mismas anchuras de campos que el grupo origen ya hemos acabado, solo resta añadir las cuentas contables básicas a la tabla cuentas.
2812  //
2813  if (GrupoempTools._LongitudesEstandar == false)
2814  {
2815  if (_Log)
2816  Guardar_Mensaje("CREACIÓN DEL NUEVO GRUPO CON LAS MISMAS LONGITUDES DE CAMPO QUE EN EL GRUPO ORIGEN." + Environment.NewLine);
2817  }
2818  else
2819  {
2820  // Se ha configurado el nuevo grupo para utilizar anchuras de campos standar, hay que detectar que anchuras son diferentes en el grupo origen de las standar y hacer los cambios según se detecte.
2821  llOk = CrearGrupo_Longitudes();
2822  if (!llOk)
2823  return false;
2824  }
2825  ActualizarBarraProgreso();
2826 
2827  // Añadir las cuentas contables básicas a la tabla CUENTAS del nuevo grupo
2828  AjustarTablaCuentas_Paso2();
2829  ActualizarBarraProgreso();
2830 
2831  if (_Log)
2832  {
2833  Guardar_Mensaje("PROCESO DE AJUSTE DE DATOS EN LAS BASES DE DATOS DEL NUEVO GRUPO FINALIZADO CORRECTAMENTE."+Environment.NewLine);
2834  Guardar_Mensaje("FIN PROCESO AJUSTE DE DATOS EN LAS BASES DE DATOS DEL NUEVO GRUPO."+Environment.NewLine);
2835  }
2836 
2837  ActualizarBarraProgreso();
2838 
2839  return true;
2840  }
2841 
2842 
2849  private static bool CrearGrupo_AjustarDatos_TablaComunes(string tcTabla, string tcNombreBaseDatos)
2850  {
2851  string lcSql = "";
2852  DataTable ldtAuxiliar = new DataTable();
2853 
2854 
2855 
2856  switch (tcTabla)
2857  {
2858  case "ACCESOLIC":
2859  // ACCESOLIC en principio mantener lo que haya en el grupo origen puesto que la licencia no cambia, en esta tabla hay un registro para COMUNES y para cada addon instalado
2860  // Como al nuevo grupo solo van a parar los addons estandar podria ser que quedase algun registro en ACCESOLIC del nuevo grupo correspondiente a un modulo que no tenga en COMUNES!MODULOS
2861  // pero no deberia afectar pues al ser la misma licencia el MD5 estara calculado correctamente == > De momento no hacer nada.
2862  break;
2863 
2864  case "CODCOM":
2865  // En principio debe respetarse todo lo que hay en el grupo origen, la licencia es la misma en el nuevo grupo y no veo que haya ningún contador.
2866  // Hay 2 campos más SAGEID y PRODUCTNAME que no se si se deberá hacer algo.
2867  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CODCOM") + " " +
2868  "SET EMAILO365='', IDCALO365='', TOKENO365='', RRIDSO365='', CMPCALO365='', BROWSER=0, PRCLIENT=0, PLANTILLAS=0 ";
2869  DB.SQLExec(lcSql);
2870  break;
2871 
2872  case "EJERCICI":
2873  DB.SQLExec( "TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "EJERCICI"));
2874 
2875  lcSql = "INSERT INTO "+ DB.SQLDatabaseReal(tcNombreBaseDatos, "EJERCICI") + " ([ANY], RUTA, RUTASER, CONEXION, PERIODOINI, PERIODOFIN, PREDET, ANTERIOR) VALUES (" +
2876  "'" + _EjerNuevo +"', "+
2877  "'" + _DbEjerGrNuevo + "', " +
2878  "'" + _DbEjerGrNuevo + "', " +
2879  "'" + _DbEjerGrNuevo + "', " +
2880  DB.SQLString(_FechaIniEjerNuevo) + ", "+
2881  DB.SQLString(_FechaFinEjerNuevo) + ", "+
2882  DB.SQLTrue() + ", "+
2883  "'')";
2884  DB.SQLExec(lcSql);
2885  break;
2886 
2887  case "FORMULS":
2888  // Esta tabla ya está en TABSYS conforme no debe borrarse pero se añadió además a la lista de tablas que pueden requerir algun tratamiento
2889  // especial por Hay unos campos de tipo CHECKSUM que en principio no deberia afectar que no se recalculen, dejamos el caso abierto por si hiciera falta
2890  // hacer algo.
2891  break;
2892 
2893  case "LETRAS":
2894  // Dejar solo letra por defecto
2895  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "LETRAS"));
2896 
2897  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "LETRAS") + " (CODIGO, NOMBRE) VALUES ('SF','SERIE DEFECTO')";
2898  lcSql += "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "LETRAS") + " (CODIGO, NOMBRE) VALUES ('SD','SERIE ALBARANES AUTOMATICOS')"; // Bug 161762
2899  DB.SQLExec(lcSql);
2900  break;
2901 
2902  case "LICENCIA":
2903  // En principio no debe hacerse nada pues es la misma licencia que el grupo origen
2904  break;
2905 
2906  case "MODULOS":
2907  // Dejar solo los modulos standar y cambiar los nombres de las bd en los campos NOM_CONEX, TABLAS y el comentario para que ponga la nueva fecha de creación
2908 
2909  string lcCadenaWhereAddons = "";
2910  foreach (string lcAddon in GrupoempTools._AddonsInstal)
2911  lcCadenaWhereAddons += " NOMBRE != '" + lcAddon.Trim().ToUpper() + "' AND ";
2912 
2913  if (!string.IsNullOrWhiteSpace(lcCadenaWhereAddons))
2914  {
2915  lcCadenaWhereAddons = lcCadenaWhereAddons.Substring(0, lcCadenaWhereAddons.Length - 4);
2916 
2917  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "MODULOS") + " " +
2918  "WHERE " + lcCadenaWhereAddons;
2919  DB.SQLExec(lcSql);
2920  }
2921 
2922 
2923  // Dejamos todos los ADDONS desactivados en el nuevo grupo
2924  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "MODULOS") + " " +
2925  "SET CONTROL='', ID=0," +
2926  "VISIBLE=" + DB.SQLFalse() + "," +
2927  "INSTALADO=" + DB.SQLFalse() + ",TIPO=0 "+
2928  "WHERE (TIPO != 4 OR NOMBRE = 'ECOMMERCE' OR NOMBRE = 'PREVENTA')"; //Bug 132259, Bug 174401
2929  DB.SQLExec(lcSql);
2930 
2931  //Bug 132259 - Los addons de tipo 4, marcarlos como instalados
2932  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "MODULOS") + " " +
2933  "SET CONTROL='', ID=0," +
2934  "VISIBLE=" + DB.SQLTrue() + "," +
2935  "INSTALADO=" + DB.SQLTrue() + " " +
2936  "WHERE TIPO = 4 AND NOMBRE <> 'ECOMMERCE' AND NOMBRE <> 'PREVENTA'"; //Bug 174401
2937  DB.SQLExec(lcSql);
2938 
2939  string lcNombreAddon = "";
2940  string lcBdAddon = "";
2941  string lcComentario = "";
2942 
2943  foreach (DataRow loRow in _dtBdAddonsGrNuevo.Rows)
2944  {
2945  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim().ToUpper();
2946  lcBdAddon = Convert.ToString(loRow["nom_conex"]).Trim().ToUpper();
2947  lcComentario = "Instalación del módulo de " + lcNombreAddon + " Fecha: " + DateTime.Today.Date.ToString("dd/MM/yy");
2948 
2949  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "MODULOS") + " " +
2950  "SET NOM_CONEX='" + lcBdAddon + "', "+
2951  "TABLAS='" + lcBdAddon + "', " +
2952  "COMENTARIO='" + lcComentario + "' "+
2953  "WHERE NOMBRE='" + lcNombreAddon + "'";
2954  DB.SQLExec(lcSql);
2955  }
2956  break;
2957 
2958  case "OPERARIO":
2959  // Dejar solo operario por defecto
2960  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPERARIO"));
2961 
2962  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPERARIO") + " (CODIGO, NOMBRE) VALUES ('01','OPERARIO PRINCIPAL')");
2963  break;
2964 
2965  case "OPC_USER":
2966  // Dejar solo los opc_user del operario 01
2967  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPC_USER"));
2968 
2969  string lcBdOpcUser = DB.SQLDatabaseReal(tcNombreBaseDatos, "OPC_USER");
2970  lcSql = "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('01','01',1); ";
2971  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('02','01',1); ";
2972  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('03','01',0); ";
2973  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('04','01',0); ";
2974  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('05','01',0); ";
2975  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('06','01',1); ";
2976  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('07','01',1); ";
2977  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('08','01',1); ";
2978  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('09','01',0); ";
2979  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('10','01',0); ";
2980  lcSql += "insert into " + lcBdOpcUser + " (opctpv, operario, valor) values ('11','01',0); ";
2981 
2982  DB.SQLExec(lcSql);
2983  break;
2984 
2985  case "OPCEMP":
2986  case "OTROSCFG":
2987  // Dejar solo los registros de la empresa 01
2988  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE EMPRESA != '"+_EmpresaGrNuevo+"' ");
2989 
2990  // Marco/desmarco el opcflag de trabajar con año partido según se ha especificado.
2991  if (tcTabla == "OPCEMP")
2992  {
2993 
2994  // Todos a false excepto los que se especifican mas abajo que se activaran
2995  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " " +
2996  "SET ESTADO = " + DB.SQLFalse() + " " +
2997  "WHERE EMPRESA = '" + _EmpresaGrNuevo + "' ";
2998  DB.SQLExec(lcSql);
2999 
3000  // Bug 213524 Activar el opcflag 10035 - ORDENAR LÍNEAS FACTURACIÓN GENERAL ALBARANES VENTA POR FECHA
3001  // Bug 147789: añado los opcflags de listas previas en documentos y en mantenimientos (9100, 9110) pues se deben activar al crear un nuevo
3002  // grupo, al igual que lo están cuando se instala Sage50 por primera vez.
3003  // Bug 171578: Al crear un nuevo grupo de empresas nuevo no activar el add-on de Fabricación con código 10009
3004  List<int> lstOpcFlagsActivar = new List<int>() { 9003, 9040, 9100, 9110, 10023, 10035, 10314, 10330, 10339, 10405, 10920,
3005  20008, 20014, 30003, 30015, 30020, 31017, 34003, 40002,
3006  50002, 50003, 14030, 20050, 30010, 30203 };
3007  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " " +
3008  "SET ESTADO = " + DB.SQLTrue() + " " +
3009  "WHERE EMPRESA = '" + _EmpresaGrNuevo + "' AND (";
3010 
3011  foreach (int lnOpc in lstOpcFlagsActivar)
3012  lcSql += " TIPO_OPC = " + lnOpc.ToString() + " OR ";
3013 
3014  lcSql = lcSql.Substring(0, lcSql.Length - 3) + ")";
3015  DB.SQLExec(lcSql);
3016 
3017 
3018  // Opcflag de configuracion de año partido.
3019  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " " +
3020  "where empresa='" + _EmpresaGrNuevo + "' and tipo_opc=9008", ref ldtAuxiliar);
3021  if (ldtAuxiliar.Rows.Count == 0)
3022  {
3023  // En teoria esto no deberia ocurrir pero nos aseguramos
3024  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " (EMPRESA,TIPO_OPC,ESTADO) " +
3025  "VALUES ('" + _EmpresaGrNuevo + "',9008,"+ ( GrupoempTools._CfgEjerPartiGrNuevo ? DB.SQLTrue() : DB.SQLFalse() )+")");
3026  }
3027  else
3028  {
3029 
3030  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " " +
3031  "SET ESTADO="+ ( GrupoempTools._CfgEjerPartiGrNuevo ? DB.SQLTrue() : DB.SQLFalse() )+" "+
3032  "WHERE EMPRESA='" + _EmpresaGrNuevo + "' AND TIPO_OPC=9008";
3033  DB.SQLExec(lcSql);
3034  }
3035 
3036 
3037  // Tratamiento especial opcflag de "ACTIVAR CONTRASEÑAS SEGURAS DE USUARIO".
3038  // Tanto si se ha configurado que se arrastren usuarios del grupo origen al grupo destino como si no (en este último caso se pasa solo el usuario SUPERVISOR) debe arrastrarse
3039  // también obligatoriamente el valor de dicho opcflag puesto que en la tabla de usuarios estan las contraseñas.
3040 
3041  // Captar valor del opcflag en la empresa del grupo origen.
3042  bool llValorOpcFlag = false;
3043 
3044  DB.SQLExec("select estado from " + DB.SQLDatabaseReal(_DbComunesGrOrigen, "OPCEMP") + " " +
3045  "where empresa='" + _EmpresaGrNuevo + "' and tipo_opc=50030", ref ldtAuxiliar);
3046  if (ldtAuxiliar.Rows.Count == 1)
3047  llValorOpcFlag = Convert.ToBoolean(ldtAuxiliar.Rows[0]["estado"]);
3048 
3049 
3050  // Buscamos el opcemp en el grupo destino, si no existe el registro lo creamos, sino lo updatamos, siempre con el valor del opcflag hallado en el grupo origen.
3051  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " " +
3052  "where empresa='" + _EmpresaGrNuevo + "' and tipo_opc=50030", ref ldtAuxiliar);
3053  if (ldtAuxiliar.Rows.Count == 0)
3054  {
3055  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " (EMPRESA,TIPO_OPC,ESTADO) " +
3056  "VALUES ('" + _EmpresaGrNuevo + "',50030," + (llValorOpcFlag ? DB.SQLTrue() : DB.SQLFalse()) + ")");
3057  }
3058  else
3059  {
3060 
3061  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " " +
3062  "SET ESTADO=" + (llValorOpcFlag ? DB.SQLTrue() : DB.SQLFalse()) + " " +
3063  "WHERE EMPRESA='" + _EmpresaGrNuevo + "' AND TIPO_OPC=50030";
3064  DB.SQLExec(lcSql);
3065  }
3066 
3067 
3068  //Bug 161447 - Activar el opcflag "AMPLIAR DEFINICIÓN EN VENTAS" si en el grupo principal tenemos el addon de conceptos facturables
3069  if (AddonGrupoOrigen("ConceptosFacturables"))
3070  ActivarOpcflag(tcNombreBaseDatos, 10006, true);
3071 
3072  // Activamos el opcflag "DESCRIPCIÓN LARGA POR DEFECTO EN LAS DEFINICIONES DEBE Y HABER EN ASIENTOS FACTURAS"
3073  // Task 191494
3074  ActivarOpcflag(tcNombreBaseDatos, 30203, true);
3075  }
3076  else if (tcTabla == "OTROSCFG")
3077  {
3078  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OTROSCFG") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
3079  if (ldtAuxiliar.Rows.Count == 0)
3080  {
3081  // En teoria esto no deberia ocurrir pero nos aseguramos
3082  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OTROSCFG") + " (EMPRESA) VALUES ('" + _EmpresaGrNuevo + "')");
3083  }
3084  }
3085 
3086  break;
3087 
3088  case "OPCESPUS":
3089  case "PERF_USERS":
3090  case "USRBROWSER":
3091  case "USRWIDGET":
3092  case "ACCE_MON":
3093  // Dejar solo los registros del usuario SUPERVISOR o de todos los usuarios en función de si arrastramos usuarios o no
3094  if (!_ConservarUsuarios)
3095  {
3096  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE USUARIO!='SUPERVISOR'");
3097  }
3098  break;
3099 
3100  case "PRGS":
3101  // Dejar solo los modulos standar
3102  string lcCadenaWhereMods = "";
3103  foreach (string lcAddon in GrupoempTools._AddonsInstal)
3104  lcCadenaWhereMods += " MODULO != '" + lcAddon.Trim().ToUpper() + "' AND ";
3105 
3106  if (!string.IsNullOrWhiteSpace(lcCadenaWhereMods))
3107  {
3108  lcCadenaWhereMods = lcCadenaWhereMods.Substring(0, lcCadenaWhereMods.Length - 4);
3109  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "PRGS") + " " +
3110  "WHERE "+lcCadenaWhereMods;
3111  DB.SQLExec(lcSql);
3112  }
3113  break;
3114 
3115  case "OPCINDICA":
3116  // Esta tabla ya está en TABSYS conforme no debe borrarse pero se añadió además a la lista de tablas que pueden requerir algun tratamiento
3117  // especial por Hay unos campos de tipo CHECKSUM que en principio no deberia afectar que no se recalculen, dejamos el caso abierto por si hiciera falta
3118  // hacer algo.
3119  break;
3120 
3121  case "USRDESKTOP":
3122  // Si conservamos usuarios no tocaremos nada, si no conservamos usuarios dejamos solo los escritorios del SUPERVISOR y el base el cual no tiene declarado USUARIO
3123  if (!_ConservarUsuarios)
3124  {
3125  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "USRDESKTOP") + " WHERE USUARIO!='' AND USUARIO!='SUPERVISOR'");
3126  }
3127  break;
3128 
3129  case "USUARIOS":
3130  // Si conservamos usuarios no tocaremos nada, si no conservamos usuarios dejamos solo los escritorios del SUPERVISOR y el base el cual no tiene declarado USUARIO
3131  if (!_ConservarUsuarios)
3132  {
3133  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "USUARIOS") + " WHERE CODIGO != 'SUPERVISOR' AND CODIGO != 'SAGESYSTEM' AND IDUSUARIO = '' ");
3134  }
3135 
3136  string lcGrupoActual = tcNombreBaseDatos.Substring(4);
3137  string lcGrupoPripal = _Obtener_CodGrupoPripal(DB.DbComunes.Trim().Substring(4, 4));
3138 
3139  // Para evitar "mandangas", vaciamos la tabla antes de hacer la inserción
3140  DB.SQLExec("DELETE FROM " + DB.SQLDatabase("EUROWINSYS", "accesogrup") +
3141  " FROM " + DB.SQLDatabase("EUROWINSYS", "accesogrup") + " a " +
3142  " INNER JOIN ( " +
3143  " SELECT DISTINCT c.IDSAGE50, " + DB.SQLString(lcGrupoActual) + " as GRUPO, c.MODULO, c.USUARIO " +
3144  " FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "usuarios") + " a " +
3145  " INNER JOIN " + DB.SQLDatabase("EUROWINSYS", "uniusers") + " b on a.idusuario = b.IDUSUARIO " +
3146  " INNER JOIN " + DB.SQLDatabase("EUROWINSYS", "accesogrup") + " c on b.IDSAGE50 = c.IDSAGE50 " +
3147  " WHERE a.idusuario != '' and c.grupo = " + DB.SQLString(lcGrupoPripal) +
3148  " ) b ON a.idsage50 = b.idsage50 AND a.grupo = b.grupo AND a.modulo = b.modulo AND a.usuario = b.usuario ");
3149 
3150  // Crear registro en tabla EUROWINSYS.ACCESOGRUP para el nuevo grupo que se crea
3151  DB.SQLExec("INSERT INTO " + DB.SQLDatabase("EUROWINSYS", "accesogrup") + " (IDSAGE50, GRUPO, MODULO, USUARIO, NIVEL, GUID_ID) " +
3152  " SELECT DISTINCT c.IDSAGE50, " + DB.SQLString(lcGrupoActual) + " as GRUPO, c.MODULO, c.USUARIO, CASE WHEN c.USUARIO = 'SUPERVISOR' THEN c.NIVEL ELSE " + (_ConservarUsuarios ? " c.NIVEL " : DB.SQLString(0)) + " END as NIVEL, c.GUID_ID " +
3153  " FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "usuarios") + " a " +
3154  " INNER JOIN " + DB.SQLDatabase("EUROWINSYS", "uniusers") + " b on a.idusuario = b.IDUSUARIO " +
3155  " INNER JOIN " + DB.SQLDatabase("EUROWINSYS", "accesogrup") + " c on b.IDSAGE50 = c.IDSAGE50 " +
3156  " WHERE a.idusuario != '' and c.grupo = " + DB.SQLString(lcGrupoPripal));
3157 
3158  break;
3159 
3160  case "COMPRCNF":
3161  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "COMPRCNF") + " " +
3162  "SET NUMSERIE=100000000000";
3163  DB.SQLExec(lcSql);
3164  break;
3165 
3166  case "DATA_IV2":
3167  case "DATA_RE2":
3168 
3169  // Vaciamos el contenido que pudiera haber, pudieramos haber conseguido lo mismo quitando estas 2 tablas de las lista de tablas con procesos
3170  // especiales a realizar pero lo dejamo abierto por si hubiera que hacer algún cambio en un futuro. Así pues, vacío las tablas manualmente.
3171  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla));
3172 
3173  if(GrupoempTools._CfgEjerPartiGrNuevo)
3174  {
3175  lcSql = String.Empty;
3176  int mesesPorPerido = 12 / 4;
3177 
3178  DateTime inicioPeriodo = new DateTime(Convert.ToInt32(_EjerNuevo), 1, 1);
3179 
3180  for (int periodo = 1; periodo <= 4; periodo++)
3181  {
3182  DateTime ultimoDiaPeriodo = inicioPeriodo.AddMonths(periodo * mesesPorPerido).AddDays(-1);
3183  string lcFechaFinPeriodo = DB.SQLString(ultimoDiaPeriodo);
3184 
3185  lcSql += "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " (PERIODO, SOPOR, REPER, EMPRESA, EJERCICIO) " +
3186  "VALUES (" + periodo + ", " + lcFechaFinPeriodo + ", " + lcFechaFinPeriodo + ", " + DB.SQLString(_EmpresaGrNuevo) + "," + _EjerNuevo + "); ";
3187  }
3188 
3189  inicioPeriodo = inicioPeriodo.AddYears(1);
3190 
3191  for (int periodo = 1; periodo <= 4; periodo++)
3192  {
3193  DateTime ultimoDiaPeriodo = inicioPeriodo.AddMonths(periodo * mesesPorPerido).AddDays(-1);
3194  string lcFechaFinPeriodo = DB.SQLString(ultimoDiaPeriodo);
3195 
3196  lcSql += "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " (PERIODO, SOPOR, REPER, EMPRESA, EJERCICIO) " +
3197  "VALUES (" + periodo + ", " + lcFechaFinPeriodo + ", " + lcFechaFinPeriodo + ", " + DB.SQLString(_EmpresaGrNuevo) + "," + (Convert.ToInt32(_EjerNuevo) + 1) + "); ";
3198  }
3199  DB.SQLExec(lcSql);
3200 
3201  }
3202 
3203  break;
3204 
3205  case "FPAG_GIR":
3206  // Si conservamos clientes no tocaremos nada, si no conservamos clientes dejamos los giros de las formas de pago.
3207  if (!_ConservarClientes)
3208  {
3209  DB.SQLExec( "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "FPAG_GIR"));
3210  }
3211  break;
3212 
3213  case "VARIABLE":
3214  // Eliminar variables de bankingcloud que puedan haber grabadas provenientes del grupo origen a partir del que se crea el grupo, así como la variable utilizada para la activación del módulo de banking cloud
3215  // (es un modulo que no instala ficheros, solo variable), idem esto último también para sage capture.
3216  //Bug 172290 => Eliminamos variables de DTS ya que el nuevo grupo no tiene ese origen
3217  // El resto de variables las dejamos.
3218  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "VARIABLE") + " " +
3219  "WHERE LOWER(VARIABLE)='wc_sbforganization' or " +
3220  "LOWER(VARIABLE)='wc_sbfsigningkey' or " +
3221  "LOWER(VARIABLE)='wc_sbfemailadmin' or " +
3222  "LOWER(VARIABLE)='wc_sbfcompany' or " +
3223  "LOWER(VARIABLE)='wl_sagebankfeeds' or " +
3224  "LOWER(VARIABLE)='wl_sagecapture' or " +
3225  "LOWER(VARIABLE)='wl_dts_lanzado' or " +
3226  "LOWER(VARIABLE)='new_calculopm' or " +
3227  "LOWER(VARIABLE)='wl_gestcomercial' or " +
3228  "LOWER(VARIABLE)='wn_dts_tipo' or " +
3229  "LOWER(VARIABLE)='aviso_ultcost' ";
3230  DB.SQLExec(lcSql);
3231 
3232  // Nuevo método de cálculo de precios medios
3233  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "VARIABLE") + " (variable, tipo, valor) values ('NEW_CALCULOPM','L','.T.')");
3234  break;
3235 
3236  case "ASINOM":
3237 
3238  // Solo pasamos los asientos predefinidos que no tengan declarados cuentas contables concretas (8 ó más dígitos),
3239  // borramos los que no cumplen esta condición.
3240  //
3241  // Ojo que las tablas ASINOM y ASIDEFIN estan tanto en COMUNES como en GESTION
3242  //
3243  AjustarTablasPredefinidos(tcNombreBaseDatos);
3244 
3245  break;
3246 
3247  case "ASIDEFIN":
3248  // Realmente esta tabla se procesa en el momento que nos encontramos con ASINOM, ponemos
3249  // su caso aquí de forma simbólica. Esta incluida en la lista de tablas con tratamiento especifico
3250  // para que al crear grupo no se pase al nuevo grupo ni llena ni vacía. Debe tratarse, y esto se
3251  // hace cuando se encuentra la tabla "padre" de ella que es "ASIINOM". El tratamiento consiste en
3252  // eliminar plantillas que contengan cuentas contables de 8 o más digitos pues al no pasarse las
3253  // cuentas contables al nuevo grupo éstas es muy probable que no existan.
3254  //
3255  // Ojo que las tablas ASINOM y ASIDEFIN estan tanto en COMUNES como en GESTION
3256  //
3257  break;
3258 
3259  case "PLSEPA_C":
3260  case "PLSEPA_D":
3261  // Dejar solo los registros de la empresa 01
3262  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE EMPRESA!='' AND EMPRESA!='" + _EmpresaGrNuevo + "'");
3263  break;
3264 
3265 
3266  }
3267 
3268  return true;
3269  }
3270 
3271 
3288  private static void AjustarTablasPredefinidos(string tcNombreBaseDatos)
3289  {
3290 
3291  //CCR 159418 => Damos plantillas con cuentas informadas que al crear grupos no se traspasan. Se acuerda un nuevo enfoque del problema
3292  //para no perde plantillas. Aquellas que utilicen cuentas completas se mantendrán pero cambiando la cuenta por su nivel 1 (que sí podemos garantizar)
3293  //de esta forma la plantilla se mantiene y no darán error al ejecutar ya que previamente a la ejecución el usuario ha de informar la cuenta
3294  //Bug 163590 => Se corta a Nivel 3 y no Nivel 1 para preservar las contrapartidas (que se borran al validar cuentas inferiores a nivel 3)
3295  string lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "ASIDEFIN") + " SET CUENTA = LEFT(LTRIM(CUENTA),3) WHERE LEN(LTRIM(RTRIM(CUENTA))) >= 8 ";
3296  DB.SQLExec(lcSql);
3297 
3298  //DEPRECATED
3302 
3303  //string lcSql = "SELECT CODIGO FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "ASINOM") + " " +
3304  // "WHERE CODIGO IN (SELECT CODIGO FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "ASIDEFIN") + " " +
3305  // "WHERE LEN(LTRIM(RTRIM(CUENTA))) >= 8)";
3306  //DataTable ldtAsiNom = new DataTable();
3307  //DB.SQLExec(lcSql, ref ldtAsiNom);
3308  //if (ldtAsiNom.Rows.Count > 0)
3309  //{
3310  // string lcCodPlantilla = "";
3311  // foreach (DataRow loRow in ldtAsiNom.Rows)
3312  // {
3313  // lcCodPlantilla = Convert.ToString(loRow["codigo"]);
3314 
3315  // lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "ASINOM") + " " +
3316  // "WHERE CODIGO = '" + lcCodPlantilla + "'";
3317  // DB.SQLExec(lcSql);
3318 
3319  // lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "ASIDEFIN") + " " +
3320  // "WHERE CODIGO = '" + lcCodPlantilla + "'";
3321  // DB.SQLExec(lcSql);
3322  // }
3323  //}
3324  }
3325 
3326 
3333  private static bool CrearGrupoEjer_AjustarDatos_TablaGestion(string tcTabla, string tcNombreBaseDatos)
3334  {
3335  string lcSql = "";
3336  DataTable ldtAuxiliar = new DataTable();
3337 
3338 
3339  // lstTablasEspeciales = new List<string>() {"ACCESOS","ALMACEN","CFGFACT","CODIGOS","CONTACNF","CONTADOR","COTIZA","DATA_IVA","DATA_RET","EMPRESA","FACTUCNF","FAMILIAS", "FLAGS",
3340  // "LLIS_PER","LLIS_RET","MARCAS", "MENUS","MESES","PLTCOMU", "PROGRAMS", "SERIES","TIPO_RET",
3341  // "ACTI_CLI","ACTIVI", "AGENCIA", "BANC_CLI","CIA_CRED","CLIENTES","CONTLF_CLI","CONT_CLI","CUENTAS","ENV_CLI","FPAG","GIRO_CLI","IDIOMA","RUTAS",
3342  // "TELF_CLI","TIPO_FAC","VACA_CLI","VENDEDOR","RET_EMP"};
3343 
3344  switch (tcTabla)
3345  {
3346  case "ACCESOS":
3347  // Dejar solo los accesos de la empresa de trabajo y los usuarios segun se haya seleccionado
3348  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "ACCESOS") + " " +
3349  "WHERE EMPRESA != '" + _EmpresaGrNuevo + "' " + (_ConservarUsuarios ? "" : " OR USUARIO != 'SUPERVISOR' ");
3350  DB.SQLExec(lcSql);
3351  break;
3352 
3353  case "ALMACEN":
3354  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "ALMACEN"));
3355  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "ALMACEN") + " (CODIGO,NOMBRE) VALUES ('" + new string('0', _LenAlmacen) + "','SIN ALMACEN')"); // Bug 109147
3356  break;
3357 
3358  case "CFGFACT":
3359  // Dejar solo los registros de la empresa con la que se trabaje
3360  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CFGFACT") + " WHERE EMPRESA != '" + _EmpresaGrNuevo + "'");
3361 
3362  // Nos aseguramos de que exista el registro de configuración para la empresa de trabajo.
3363  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CFGFACT") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
3364  if (ldtAuxiliar.Rows.Count == 0)
3365  {
3366  // En teoria esto no deberia ocurrir pero nos aseguramos
3367  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CFGFACT") + " (EMPRESA) VALUES ('" + _EmpresaGrNuevo + "')");
3368  }
3369  else
3370  {
3371  // Bug 164299 : Facturar sin contabilizar. Al crear grupo de empresas, si en el principal están a false CONTAVE y CONTACO, los crea desmarcados
3372  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CFGFACT") + " " +
3373  "SET EF_ENABL=0, EF_PATHVEN='', EF_PATHCOM='',MENSAJE='', EF_EXECRTF='', EF_EXEVAL='', EF_CERT='', EF_EMIS='', EF_XSIG=0, CONTAVE=1, CONTACO=1, CONTACUO=1 " +
3374  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
3375  DB.SQLExec(lcSql);
3376  }
3377  break;
3378 
3379  case "CODIGOS":
3380  // Dejar solo los registros de la empresa con la que se trabaje
3381  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CODIGOS") + " WHERE EMPRESA != '" + _EmpresaGrNuevo + "'");
3382 
3383  // Añadimos los registros correspondientes en la tabla GESTION!CODIGOS para la empresa actual
3384  String tccPathInicio, tcFileRutaIped;
3385  string tcIntrastat = @"Documentos\INTRASTAT\";
3386 
3387  tccPathInicio = Convert.ToString(DB._GetVariable("wc_pathinicio"));
3388  tcFileRutaIped = Path.Combine(tccPathInicio, tcIntrastat);
3389 
3390  // Nos aseguramos de que exista el registro de configuración para la empresa de trabajo.
3391  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CODIGOS") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
3392  if (ldtAuxiliar.Rows.Count == 0)
3393  {
3394  // En teoria esto no deberia ocurrir pero nos aseguramos
3395  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CODIGOS") + " (EMPRESA,PAIS,VENDEDOR,MODOTRANS,NA1,NA2,REGESTAT,RUTAIDEP) " +
3396  "VALUES ('" + _EmpresaGrNuevo + "'," +
3397  "'034'," +
3398  "'" + new string('0', _LenVendedor - 1) + "1', " +
3399  "'3'," +
3400  "9, " +
3401  "1, " +
3402  "1,'" +
3403  DB.SQLString(tcFileRutaIped) + ")") ; // Bug 109147
3404  }
3405  else
3406  {
3407  if (!_ConservarClientes)
3408  {
3409  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CODIGOS") + " " +
3410  "SET VENDEDOR='" + new string('0', _LenVendedor - 1) + "1', " + // Bug 109147
3411  "MODOTRANS = '3', NAT1 = 9, NAT2 = 1, REGESTAT = 1, RUTAIDEP = " + DB.SQLString(tcFileRutaIped) +
3412  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
3413  DB.SQLExec(lcSql);
3414  }
3415  }
3416  break;
3417 
3418  case "CONTACNF":
3419  case "FLAGS":
3420  // Dejar solo los registros de la empresa con la que se trabaje
3421  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE EMPRESA != '" + _EmpresaGrNuevo + "'");
3422 
3423  // Nos aseguramos de que exista el registro de configuración para la empresa de trabajo.
3424  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
3425  if (ldtAuxiliar.Rows.Count == 0)
3426  {
3427  // En teoria esto no deberia ocurrir pero nos aseguramos
3428  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " (EMPRESA) VALUES ('" + _EmpresaGrNuevo + "')");
3429 
3430  if (tcTabla == "CONTACNF")
3431  {
3432  string lcEuroserv = GrupoempTools._Euroserv.Trim();
3433  string lcDirCartas = Path.Combine(lcEuroserv,"Reports\\");
3434  string lcDirPagares = Path.Combine(lcEuroserv,"Reports\\Pagares\\");
3435 
3436  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONTACNF") + " " +
3437  "SET DIAS_RIESGO=15, AUTIVARET = 1, " +
3438  "IMPUTAR_AN=1, PLAN1='', PLAN2='', " +
3439  "CARTAS='"+lcDirCartas+"', "+
3440  "DIRPAGA='" + lcDirPagares + "', " +
3441  "COBROEFEC='"+_PrefijoBan3+new String('0',_LenCuenta-4)+"1' " +
3442  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
3443  DB.SQLExec(lcSql);
3444  }
3445  }
3446 
3447  if (tcTabla == "CONTACNF")
3448  {
3449  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONTACNF") + " " +
3450  "SET IMPUTAR_AN = 1, PLAN1 = '', PLAN2 = '' " +
3451  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
3452  DB.SQLExec(lcSql);
3453  }
3454 
3455  break;
3456 
3457  case "FAMILIAS":
3458  string lcCtaCompra = _PrefijoCom3 + new string('0', _LenCuenta - 4) + "1";
3459  string lcCtaVenta = _PrefijoVen3 + new string('0', _LenCuenta - 4) + "1";
3460  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "FAMILIAS"));
3461 
3462  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "FAMILIAS") + " (CODIGO,NOMBRE,CTA_COMPRA,CTA_VENTA) VALUES ('"+new string('0',_LenFamilia)+"','SIN FAMILIA','" + lcCtaCompra + "','" + lcCtaVenta + "')");
3463 
3464  break;
3465 
3466  case "DATA_IVA":
3467  case "DATA_RET":
3468  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla));
3469 
3470  string lcTablaPeriodos = DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla);
3471 
3472  lcSql = "insert into " + lcTablaPeriodos + " (empresa, periodo, reper, sopor) values ('" + _EmpresaGrNuevo + "', 1, '31/03/" + GrupoempTools._EjerNuevo + "', '31/03/" + GrupoempTools._EjerNuevo + "'); ";
3473  lcSql += "insert into " + lcTablaPeriodos + " (empresa, periodo, reper, sopor) values ('" + _EmpresaGrNuevo + "', 2, '30/06/" + GrupoempTools._EjerNuevo + "', '30/06/" + GrupoempTools._EjerNuevo + "'); "; // Bug 109011
3474  lcSql += "insert into " + lcTablaPeriodos + " (empresa, periodo, reper, sopor) values ('" + _EmpresaGrNuevo + "', 3, '30/09/" + GrupoempTools._EjerNuevo + "', '30/09/" + GrupoempTools._EjerNuevo + "'); ";
3475  lcSql += "insert into " + lcTablaPeriodos + " (empresa, periodo, reper, sopor) values ('" + _EmpresaGrNuevo + "', 4, '31/12/" + GrupoempTools._EjerNuevo + "', '31/12/" + GrupoempTools._EjerNuevo + "'); ";
3476 
3477  DB.SQLExec(lcSql);
3478 
3479  break;
3480 
3481  case "CONTADOR":
3482  // Dejar solo los registros de la empresa con la que se trabaje
3483  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONTADOR") + " WHERE EMPRESA != '" + _EmpresaGrNuevo + "'");
3484 
3485  // Nos aseguramos de que existan registro de la empresa en cuestion
3486  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONTADOR") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
3487  if (ldtAuxiliar.Rows.Count == 0)
3488  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONTADOR") + " (EMPRESA) VALUES ('" + _EmpresaGrNuevo + "')");
3489 
3490 
3491  // Calculo el contador para cuotas
3492  int lnContador = Convert.ToInt32( Convert.ToDateTime(_FechaIniEjerNuevo).Year.ToString().Substring(2,2)) * 100000;
3493 
3494  // Los campos SERIES si en el origen se trabaja con artículos serializados debería haber 8758, lo resetamos.
3495  // En el campo TYC si en el origen se trabaja con tallas y colores debería haber 5400, lo resetamos.
3496 
3497 
3498  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONTADOR") + " " +
3499  "SET PRESUVEN=0, CLIENTES=0, TRABAJO=0, PLANTILLAS=0, PRODUCCION=0, TRANSFORM=0, " +
3500  "ETIQUETA=0, MODELO=0, DESCUADRE=0, CONT_ARTI=0, ENTREGAS=0, SERIES=0, TYC=0, CUOTAS=" + lnContador.ToString().Trim() +
3501  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
3502  DB.SQLExec(lcSql);
3503  break;
3504 
3505  case "PROGRAMS":
3506 
3507  string lcCadenaWhereAddon = "";
3508  foreach (string lcAddon in GrupoempTools._AddonsInstal)
3509  lcCadenaWhereAddon += " (UPPER(COMANDO) NOT LIKE '%"+lcAddon+"%') AND ";
3510 
3511  if (!string.IsNullOrWhiteSpace(lcCadenaWhereAddon))
3512  lcCadenaWhereAddon = lcCadenaWhereAddon.Substring(0, lcCadenaWhereAddon.Length - 4);
3513 
3514  // Dejar solo los registros standar de CONTABILIDAD, VENTAS, COMPRAS y los de ADDONS estandar LOTES, TPV, MAYORIST, AMORTIZA, INFORAUT
3515  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "PROGRAMS") + " " +
3516  "WHERE COMANDO != '' AND " +
3517  "(UPPER(COMANDO) NOT LIKE '%CONTABIL%') AND " +
3518  "(UPPER(COMANDO) NOT LIKE '%VENTAS%') AND " +
3519  "(UPPER(COMANDO) NOT LIKE '%COMPRAS%') AND " + lcCadenaWhereAddon;
3520  DB.SQLExec(lcSql);
3521 
3522  break;
3523 
3524  case "TIPO_RET": // La tabla TIPO_IVA no la ponemos pues ya esta en TABSYS conforme no se ha de borrar, OJO con las cuentas declaradas en TIPO_RET y TIPO_IVA
3525  case "COTIZA":
3526  // Mantenemos su contenido, no hacemos nada
3527  break;
3528 
3529  case "MARCAS":
3530  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "MARCAS"));
3531 
3532  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "MARCAS") + " (CODIGO,NOMBRE) VALUES ('"+new string('0',_LenMarca)+"','SIN MARCA')");
3533 
3534  break;
3535 
3536  case "SERIES":
3537  // Dejaremos solamente los registros de la empresa y serie SF
3538  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "SERIES"));
3539 
3540  string lcTabSer = DB.SQLDatabaseReal(tcNombreBaseDatos, "SERIES");
3541 
3542  // Bug 161762 - Añadir la serie SF
3543  // Bug 164310 - Volver a añadir la serie SD ya que sigue estando en el mantenimiento de series y por tanto se puede utilizar.
3544  List<string> lstSeries = new List<string> { "SF", "SD" };
3545  lcSql = string.Empty;
3546 
3547  foreach (string lcSerie in lstSeries)
3548  {
3549  for (int i = 1; i < 9; i++)
3550  {
3551  lcSql += "INSERT INTO " + lcTabSer + " (EMPRESA,SERIE,TIPODOC) VALUES ('" + _EmpresaGrNuevo + "','"+lcSerie+"',"+Convert.ToString(i)+");";
3552  }
3553  }
3554 
3555  DB.SQLExec(lcSql);
3556 
3557  break;
3558 
3559  case "RET_EMP":
3560  if (!_ConservarClientes)
3561  {
3562  // Si no conservamos clientes del grupo origen borramos su contenido
3563  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "RET_EMP"));
3564  }
3565  else
3566  {
3567  // Si conservamos clientes borramos todo lo que no sea de clientes o de la empresa
3568  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "RET_EMP") + " " +
3569  "WHERE EMPRESA != '" + _EmpresaGrNuevo + "' OR LEFT(CUENTA,3)!='" + GrupoempTools._PrefijoCli3 + "'");
3570  }
3571  break;
3572 
3573  case "PLTCOMU":
3574  // Borramos las plantillas que no sean del sistema, es decir, las que no comiencen por 9
3575  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "PLTCOMU") + " " +
3576  "WHERE LEFT(CODIGO,1) != '9'");
3577  break;
3578 
3579  case "MESES":
3580  // Borramos los registros que no sean de la empresa
3581  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "MESES"));
3582  string lcBdMeses = DB.SQLDatabaseReal(tcNombreBaseDatos, "MESES");
3583 
3584  // Ejercicio partido
3585  Dictionary<int, string> loDicMeses = new Dictionary<int, string>() { { 1, "ENERO" }, { 2, "FEBRERO" }, { 3, "MARZO" }, { 4, "ABRIL" }, { 5, "MAYO" }, { 6, "JUNIO" }, { 7, "JULIO" }, { 8, "AGOSTO" }, { 9, "SEPTIEMBRE" }, { 10, "OCTUBRE" }, { 11, "NOVIEMBRE" }, { 12, "DICIEMBRE" } };
3586 
3587  if (GrupoempTools._CfgEjerPartiGrNuevo)
3588  {
3589  int lnMesIni = Convert.ToDateTime(GrupoempTools._FechaIniEjerNuevo).Month;
3590  int lnMesFin = Convert.ToDateTime(GrupoempTools._FechaFinEjerNuevo).Month;
3591 
3592  int lnYearIni = Convert.ToDateTime(GrupoempTools._FechaIniEjerNuevo).Year;
3593  int lnYearFin = Convert.ToDateTime(GrupoempTools._FechaFinEjerNuevo).Year;
3594 
3595  int lnInterval = (lnYearFin - lnYearIni) * 12 + lnMesFin - lnMesIni;
3596 
3597  int lnNumMes = 1;
3598 
3599  for (int ln = lnMesIni; ln <= lnMesIni + lnInterval; ln++)
3600  {
3601  int lnMes = ln % 12 == 0 ? 12 : ln % 12;
3602  String lcMes = loDicMeses[lnMes];
3603 
3604  lcSql += String.Format("INSERT INTO {0} (EMPRESA, CODIGO, MES, NUMMES, CERRADO) VALUES ('{1}', {2}, '{3}', {4}, {5}); ", lcBdMeses, _EmpresaGrNuevo, lnNumMes, lcMes, Convert.ToString(lnMes).Trim(), DB.SQLFalse());
3605 
3606  lnNumMes++;
3607  }
3608  }
3609  else
3610  {
3611  foreach (KeyValuePair<int, string> loMes in loDicMeses)
3612  {
3613  lcSql += String.Format("INSERT INTO {0} (EMPRESA, CODIGO, MES, NUMMES, CERRADO) VALUES ('{1}', {2}, '{3}', {2}, {4}); ", lcBdMeses, _EmpresaGrNuevo, loMes.Key, loMes.Value, DB.SQLFalse());
3614  }
3615  }
3616 
3617  DB.SQLExec(lcSql);
3618  break;
3619 
3620  case "MENUS":
3621  // Si conservamos usuarios no tocaremos nada, si no conservamos usuarios dejamos solo los escritorios del SUPERVISOR y el base el cual no tiene declarado USUARIO
3622  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "MENUS") + " " +
3623  "WHERE EMPRESA!='" + _EmpresaGrNuevo + "' " + (!_ConservarUsuarios ? " OR USUARIO!='SUPERVISOR' " : "");
3624  DB.SQLExec(lcSql);
3625  break;
3626 
3627  case "LLIS_RET":
3628  case "LLIS_PER":
3629 
3630  // Vaciar tabla
3631  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla));
3632 
3633  // Insertar registros
3634  string lcTablaLlis = DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla);
3635  lcSql = "insert into " + lcTablaLlis + " (empresa, periodo) values ('" + _EmpresaGrNuevo + "', 1);";
3636  lcSql += "insert into " + lcTablaLlis + " (empresa, periodo) values ('" + _EmpresaGrNuevo + "', 2);";
3637  lcSql += "insert into " + lcTablaLlis + " (empresa, periodo) values ('" + _EmpresaGrNuevo + "', 3);";
3638  lcSql += "insert into " + lcTablaLlis + " (empresa, periodo) values ('" + _EmpresaGrNuevo + "', 4);";
3639 
3640  DB.SQLExec(lcSql);
3641  break;
3642 
3643  case "TARIFAS":
3644 
3645  lcSql = String.Format("TRUNCATE TABLE {0} ", DB.SQLDatabaseReal(tcNombreBaseDatos, "TARIFAS"));
3646  DB.SQLExec(lcSql);
3647  //
3648  lcSql = String.Format("INSERT INTO {0} (CODIGO, NOMBRE, COSTE, IVA_INC, TIPO_TPC, NUMDEC, MONEDA) VALUES ('TD', 'TARIFA POR DEFECTO', 1, 0, 1, 2, '000' ) ", DB.SQLDatabaseReal(tcNombreBaseDatos, "TARIFAS"));
3649  DB.SQLExec(lcSql);
3650 
3651  break;
3652  case "FACTUCNF":
3653  // Borramos los registros que no sean de la empresa
3654  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "FACTUCNF") + " WHERE EMPRESA!='" + _EmpresaGrNuevo + "'");
3655 
3656  // Nos aseguramos de que exista el registro de la empresa de trabajo, si no encontrase nada de la empresa (no debería pasar) los creamos.
3657  string lcCtaVDol = "";
3658  string lcCtaCDol = "";
3659  DB.SQLExec("select empresa,c_cta_dol,v_cta_dol from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "FACTUCNF") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
3660  if (ldtAuxiliar.Rows.Count == 0)
3661  {
3662  lcCtaVDol = _PrefijoVen3 + new string('0', _LenCuenta - 4) + "1";
3663  lcCtaCDol = _PrefijoCom3 + new string('0', _LenCuenta - 4) + "1";
3664  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "FACTUCNF") + " (empresa, v_iva_dol, c_iva_dol, v_cta_dol, c_cta_dol) values ('" + _EmpresaGrNuevo + "','03','03','" + lcCtaCDol + "','" + lcCtaVDol + "')");
3665  }
3666  else
3667  {
3668  lcCtaVDol = Convert.ToString(ldtAuxiliar.Rows[0]["v_cta_dol"]);
3669  lcCtaCDol = Convert.ToString(ldtAuxiliar.Rows[0]["c_cta_dol"]);
3670  }
3671 
3672  String lcCodigoGrup = _DbComunesGrNuevo.Replace("COMU", "");
3673 
3674  // Bug 161762: Si tenemos el addon de conceptos facturables, asignar el vendedor '01'
3675  string lcVendedorCutoas = AddonGrupoOrigen("ConceptosFacturables") ? "01" : "";
3676 
3677  string lcTarifaPret = "TD";
3678  if (AddonGrupoOrigen("ConceptosFacturables"))
3679  lcTarifaPret = ObtenerTarifaDefecto(lcTarifaPret);
3680 
3681  // Actualizamos campos
3682  lcSql = String.Format("UPDATE {0} SET EMP_STOCK= '{1}', CONVERSION=1, DIAS_ENTRE=15, UNIDADES='999,999.99', GRANUNIDADES='999,999.99', ALBAVEN='ALBAVEN', FACTUVEN='FACTUVEN', PEDIVEN='PEDIVEN', " +
3683  "DEPOVEN='DEPOVEN', PRESUVEN='PRESUVEN', PEDICOM='PEDICOM', ALBACOM='ALBACOM'," +
3684  "FACTUCOM='FACTUCOM', ENVIO='ENVIO', ENVIO2='ENVIO2', RECIBO='RECIBO', REC_ESPE='REC_ESPE', PRESUVEN2='PRESUVEN', RECCUOTA='RECCUOTA', PAGARE='PAGARE', TICKET='TICKET'," +
3685  "ENTREGA='ENTREGA', VALE='VALE', PRECOM='PRECOM', DEPCOM='DEPOCOM', C_ALBAVEN=0, C_ALBACOM=0, TARIFAPRET= "+DB.SQLString(lcTarifaPret)+", RUTAEXP='" + Path.Combine(Convert.ToString(DB._GetVariable("wc_iniservidor")).Trim(), "DOCS_SAGE\\" + lcCodigoGrup) + "', FAMENV='', CALBDTOS=2, VALBDTOS=2, REPARTO='HOJA_REP', " + //Bug 109060, Bug 111844
3686  "LFPAGCUOTAS = 1, LIMPFACTUCUOTAS = 1, LIMPRECIBOCUOTA = 1, LCONTADORCUOTAS = 1, " +
3687  "OPERARIOCUOTAS='', VENDEDORCUOTAS= " + DB.SQLString(lcVendedorCutoas) +", FPAGCUOTAS='', LETRACUOTAS='', BANCOCUOTAS='' "+ // BUG 133632
3688  "WHERE EMPRESA='{1}' ", DB.SQLDatabaseReal(tcNombreBaseDatos, "FACTUCNF"), _EmpresaGrNuevo);
3689  DB.SQLExec(lcSql);
3690 
3691  //Bug 147964: Crear la carpeta de exportación de documentos si no existe
3692  if (!Directory.Exists(Path.Combine(Convert.ToString(DB._GetVariable("wc_iniservidor")).Trim(), "DOCS_SAGE\\" + lcCodigoGrup)))
3693  Directory.CreateDirectory(Path.Combine(Convert.ToString(DB._GetVariable("wc_iniservidor")).Trim(), "DOCS_SAGE\\" + lcCodigoGrup));
3694 
3695  break;
3696 
3697  case "EMPRESA":
3698  // Borramos los registros que no sean de la empresa
3699  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "EMPRESA") + " WHERE CODIGO!='" + _EmpresaGrNuevo + "'");
3700 
3701  // Comrpobamos que exista el registro de la empresa que nos interesa, caso de no existir lo creamos.
3702  DB.SQLExec("select codigo from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "EMPRESA") + " where codigo='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
3703  if (ldtAuxiliar.Rows.Count == 0)
3704  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "EMPRESA") + " (codigo) values ('" + _EmpresaGrNuevo + "')");
3705 
3706  // Calculo el contador per FRACEE
3707  int lnContEmail = Convert.ToInt32(Convert.ToDateTime(_FechaIniEjerNuevo).Year.ToString().Substring(2, 2)) * 100000;
3708  int lnContFracee = lnContEmail + 50000;
3709 
3710  // Bug 162721 - Asignar la serie "SF"
3711  // Bug 161762: Si tenemos el addon de conceptos facturables, asignar la serie 'SD'
3712  string lcLetra = "SF";
3713 
3714  string lcTarifaCF = "";
3715  if (AddonGrupoOrigen("ConceptosFacturables"))
3716  {
3717  // Bug 162717 - Asignar tarifa, por defecto, TD
3718  lcTarifaCF = "TD";
3719  lcTarifaCF = ObtenerTarifaDefecto(lcTarifaCF);
3720 
3721  }
3722 
3723  // Actualizamos campos
3724  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "EMPRESA") + " " +
3725  "SET NOMBRE=" + DB.SQLString(_NombreEmpresa) + ", CIF=" + DB.SQLString(_CifEmpresa) + ", NOMBRE2='', DIRECCION='', CODPOS='', TELEFONO='', POBLACION='', PROVINCIA='', " +
3726  "FAX='', MONEDA='000', TIPO='Normal', FRACEE=" + lnContFracee.ToString().Trim() + ", " +
3727  "PEDIVEN=0, DEPVEN=0, PRESUP=0, ALBAVEN=0, FACTUVEN=0, TRASPASO=0, REGULARIZA=0, PEDICOM=0, FACTUCOM=0, ASIENTO=0, IVASOPOR=0," +
3728  "TIPO_IVA='',TXTALBA1='', TXTALBA2='', TXTFACTU1='', TXTFACTU2='', EMAIL='', HTTP='', MOBIL='', REMESA=0, ORDEN=0, PEDICO1=''," +
3729  "PEDICO2='', FACTUCOM1='', FACTUCOM2='', LETRA = " + DB.SQLString(lcLetra) + ", ALMFABRI='" + new string('0', _LenAlmacen) + "', REMESAPA=0, PASWORD='', PRECOM=0, ALBACOM=0, DEPCOM=0, COMUNICA=0, " + // Bug 109147
3730  "TXTEFACTU1='', TXTEFACTU2='', IVA_ISP='', " +
3731  "REFUNDIRP=0, ALMACEN='" + new string('0', _LenAlmacen) + "', REFUNDIR=0, C_EMAIL=" + lnContEmail.ToString().Trim() + ", " + // Bug 109147
3732  "CONTACT=0, CAPTURE=0, USER_ROL=0, PYG_BAL='', DASHBOARD=0 " + ", " + //Bug 136392
3733  "PERIODOINI=" + DB.SQLString(_FechaIniEjerNuevo) + ",PERIODOFIN=" + DB.SQLString(_FechaFinEjerNuevo) + ", TPC='999.99', " +
3734  "PRTAPLICAR=0, PRTBAJA=0, PRTPRC=0, PRTFECHA=null, PRTFECHADS=null, ACRONIMO = '', TARIFACF = " + DB.SQLString(lcTarifaCF) + " " +
3735  "WHERE CODIGO=" + DB.SQLString(_EmpresaGrNuevo);
3736  DB.SQLExec(lcSql);
3737  break;
3738 
3739  case "IDIOMA":
3740  // Borramos los registros que no sean de la empresa
3741  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE EMPRESA!='" + _EmpresaGrNuevo + "'");
3742 
3743  DataTable loDt = new DataTable();
3744  String lcCodigoGrupo = _DbComunesGrNuevo.Replace("COMU", "");
3745 
3746  lcSql = String.Format("SELECT * FROM {0} ", DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla));
3747  DB.SQLExec(lcSql, ref loDt);
3748 
3749  lcSql = "INSERT INTO {0} (ID, IDI_PLAN, EMPRESA, NOMBRE, FICHERO, PREDET, TIPO, OBSERVA, ID_PARENT, GRUPO ) VALUES ";
3750  lcSql += "(1, '', '{1}', 'Presupuesto de venta', 'PRESUVEN', 1, 1, 'Plantilla de Presupuesto de venta generada automáticamente', 0, '{2}' ), ";
3751  lcSql += "(2, '', '{1}', 'Pedido de venta', 'PEDIVEN', 1, 2, 'Plantilla de Pedido de venta generada automáticamente', 0 , '{2}'), ";
3752  lcSql += "(3, '', '{1}', 'Albarán de venta', 'ALBAVEN', 1, 3, 'Plantilla de Albarán de venta generada automáticamente', 0 , '{2}'), ";
3753  lcSql += "(4, '', '{1}', 'Factura de venta', 'FACTUVEN', 1, 4, 'Plantilla de Factura de venta generada automáticamente', 0 , '{2}'), ";
3754  lcSql += "(5, '', '{1}', 'Depósito de venta', 'DEPOVEN', 1, 5, 'Plantilla de Depósito de venta generada automáticamente', 0 , '{2}'), ";
3755  lcSql += "(6, '', '{1}', 'Ticket de venta', 'TICKET', 1, 6, 'Plantilla de Ticket de venta generada automáticamente', 0 , '{2}'), ";
3756  lcSql += "(7, '', '{1}', 'Propuesta de compra', 'PRECOM', 1, 7, 'Plantilla de Propuesta de compra generada automáticamente', 0 , '{2}'), ";
3757  lcSql += "(8, '', '{1}', 'Pedido de compra', 'PEDICOM', 1, 8, 'Plantilla de Pedido de compra generada automáticamente', 0 , '{2}'), ";
3758  lcSql += "(9, '', '{1}', 'Albarán de compra', 'ALBACOM', 1, 9, 'Plantilla de Albarán de venta compra automáticamente', 0 , '{2}'), ";
3759  lcSql += "(10, '', '{1}', 'Factura de compra', 'FACTUCOM', 1, 10, 'Plantilla de Factura de compra generada automáticamente', 0 , '{2}'), ";
3760  lcSql += "(11, '', '{1}', 'Depósitos de compra', 'DEPOCOM', 1, 11, 'Plantilla de Depósito de compra generada automáticamente', 0 , '{2}'); ";
3761 
3762  lcSql = String.Format(lcSql, DB.SQLDatabaseReal(_DbComunesGrNuevo, "REPLAN"), _EmpresaGrNuevo, lcCodigoGrupo);
3763  DB.SQLExec(lcSql);
3764 
3765  Int32 lnCodigo = 12;
3766 
3767  foreach (DataRow ldRow in loDt.Rows)
3768  {
3769  lcSql = String.Format("INSERT INTO {0} (ID, EMPRESA, IDI_PLAN, NOMBRE, FICHERO, PREDET, TIPO, OBSERVA, ID_PARENT, GRUPO ) VALUES ", DB.SQLDatabaseReal(_DbComunesGrNuevo, "REPLAN"));
3770  lcSql += String.Format("({2}, '{0}', '{1}', 'Presupuesto de venta', 'PRESUVEN', 1, 1, 'Plantilla de Presupuesto de venta generada automáticamente', 0 , '{3}' ), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3771  lcSql += String.Format("({2}, '{0}', '{1}', 'Pedido de venta', 'PEDIVEN', 1, 2, 'Plantilla de Pedido de venta generada automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3772  lcSql += String.Format("({2}, '{0}', '{1}', 'Albarán de venta', 'ALBAVEN', 1, 3, 'Plantilla de Albarán de venta generada automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3773  lcSql += String.Format("({2}, '{0}', '{1}', 'Factura de venta', 'FACTUVEN', 1, 4, 'Plantilla de Factura de venta generada automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3774  lcSql += String.Format("({2}, '{0}', '{1}', 'Depósito de venta', 'DEPOVEN', 1, 5, 'Plantilla de Depósito de venta generada automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3775  lcSql += String.Format("({2}, '{0}', '{1}', 'Ticket de venta', 'TICKET', 1, 6, 'Plantilla de Ticket de venta generada automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3776  lcSql += String.Format("({2}, '{0}', '{1}', 'Propuesta de compra', 'PRECOM', 1, 7, 'Plantilla de Propuesta de compra generada automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3777  lcSql += String.Format("({2}, '{0}', '{1}', 'Pedido de compra', 'PEDICOM', 1, 8, 'Plantilla de Pedido de compra generada automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3778  lcSql += String.Format("({2}, '{0}', '{1}', 'Albarán de compra', 'ALBACOM', 1, 9, 'Plantilla de Albarán de venta compra automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3779  lcSql += String.Format("({2}, '{0}', '{1}', 'Factura de compra', 'FACTUCOM', 1, 10, 'Plantilla de Factura de compra generada automáticamente', 0 , '{3}'), ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3780  lcSql += String.Format("({2}, '{0}', '{1}', 'Depósitos de compra', 'DEPOCOM', 1, 11, 'Plantilla de Depósito de compra generada automáticamente', 0 , '{3}'); ", _EmpresaGrNuevo, ldRow["CODIGO"], lnCodigo++, lcCodigoGrupo);
3781 
3782  DB.SQLExec(lcSql);
3783  }
3784 
3785  break;
3786 
3787 
3788  case "ACTI_CLI":
3789  case "ACTIVI":
3790  case "AGENCIA":
3791  case "CIA_CRED":
3792  case "FPAG":
3793  case "RUTAS":
3794  case "TIPO_FAC":
3795  case "VENDEDOR":
3796  case "BANC_CLI":
3797  case "CONTLF_CLI":
3798  case "CONT_CLI":
3799  case "ENV_CLI":
3800  case "GIRO_CLI":
3801  case "TELF_CLI":
3802  case "VACA_CLI":
3803  case "CLIENTES":
3804  // Si no conservamos clientes del grupo origen borramos su contenido
3805  if (!_ConservarClientes)
3806  {
3807  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla);
3808  DB.SQLExec(lcSql);
3809 
3810  if (tcTabla == "VENDEDOR")
3811  {
3812  string lcCodVendedor = new string('0', _LenVendedor - 1) + "1";
3813  // En el paso anterior se vació la tabla VENDEDOR, ahora dejamos el registro por defecto.
3814  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "VENDEDOR") + " (CODIGO,NOMBRE) VALUES ('" + lcCodVendedor + "','VENDEDOR POR DEFECTO')");
3815  }
3816  else if (tcTabla == "CLIENTES")
3817  {
3818  // En el paso anterior se vació la tabla CLIENTES, ahora dejamos el registro por defecto.
3819  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CLIENTES") + " (CODIGO,NOMBRE,COMUNITARI,CONTADO,PAIS,IDIOMA) " +
3820  "VALUES ('"+_PrefijoCli3+new string('0',_LenCuenta-4)+"1','CLIENTE CONTADO',1,1,'034','000')");
3821  }
3822 
3823  }
3824 
3825  break;
3826 
3827  case "CUENTAS":
3828  // El tratamiento del contenido final de la tabla cuentas se efectua en 2 pasos, primero aquí se vacia toda ella o se dejan los clientes unicamnete.
3829  // En un segundo paso que se hace al final de todo (cuando se verifica si se han de hacer cambio de anchura de campos) se añaden unos cuantos registros de cuentas
3830  // que son lo que se crean cuando se instala Sage50 a partir del CD.
3831  AjustarTablaCuentas_Paso1();
3832  break;
3833 
3834  case "ASINOM":
3835 
3836  //CCR 159418 => No borramos plantillas, cambiamos los de cuentas contables concretas (8 ó más dígitos) por su nivel 1 (que es garantizable)
3842  AjustarTablasPredefinidos(tcNombreBaseDatos);
3843 
3844  break;
3845 
3846  case "ASIDEFIN":
3847  // Realmente esta tabla se procesa en el momento que nos encontramos con ASINOM, ponemos
3848  // su caso aquí de forma simbólica. Esta incluida en la lista de tablas con tratamiento especifico
3849  // para que al crear grupo no se pase al nuevo grupo ni llena ni vacía. Debe tratarse, y esto se
3850  // hace cuando se encuentra la tabla "padre" de ella que es "ASIINOM". El tratamiento consiste en
3851  // eliminar plantillas que contengan cuentas contables de 8 o más digitos pues al no pasarse las
3852  // cuentas contables al nuevo grupo éstas es muy probable que no existan.
3853  //
3854  // Ojo que las tablas ASINOM y ASIDEFIN estan tanto en COMUNES como en GESTION
3855  //
3856  break;
3857  }
3858 
3859  return true;
3860  }
3861 
3862 
3867  private static void AjustarTablaCuentas_Paso1()
3868  {
3869  string lcSql="";
3870 
3871  if (_ConservarClientes)
3872  {
3873  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(_DbEjerGrNuevo, "CUENTAS") + " " +
3874  "WHERE LEFT(CODIGO,3) != '" + GrupoempTools._PrefijoCli3 + "'";
3875  }
3876  else
3877  {
3878  lcSql = "TRUNCATE TABLE " + DB.SQLDatabaseReal(_DbEjerGrNuevo, "CUENTAS");
3879  }
3880  DB.SQLExec(lcSql);
3881  }
3882 
3883 
3889  private static void AjustarTablaCuentas_Paso2()
3890  {
3891  string lcSql = "";
3892  string lcZeros = new string('0', (GrupoempTools._LongitudesEstandar ? 8 : GrupoempTools._LenCuenta) - 8); // Recordar que GrupoempTools._LenCuenta es la longitud del campo cuenta en el grupo origen.
3893  string lcTablaCuentas = DB.SQLDatabaseReal(_DbEjerGrNuevo, "CUENTAS");
3894  string lcTablaProveed = DB.SQLDatabaseReal(_DbEjerGrNuevo, "PROVEED");
3895  string lcTablaClientes = DB.SQLDatabaseReal(_DbEjerGrNuevo, "CLIENTES");
3896  string lcCodigo="",lcNombre="", lcSecundar="", lcDivisa="", lcCongasing="", lcConirpf="";
3897 
3898  for (int ln_i=0; ln_i<_CuentasCd.GetLength(0); ln_i++)
3899  {
3900  // Código cuenta contable a insertar.
3901  lcCodigo = _CuentasCd[ln_i,0].Substring(0,4)+lcZeros+_CuentasCd[ln_i,0].Substring(4,4);
3902 
3903  // Si la cuenta es de clientes (o deudor 440) y conservamos los clientes del grupo origen no insertarmos nada de clientes pues ya existirá y petaría.
3904  if (_ConservarClientes && (lcCodigo.Substring(0, 3) == _PrefijoCli3 || lcCodigo.Substring(0, 3) == _PrefijoDeudor3))
3905  {
3906  continue;
3907  }
3908 
3909  lcNombre = _CuentasCd[ln_i,1];
3910  lcSecundar = _CuentasCd[ln_i,2];
3911  lcDivisa = _CuentasCd[ln_i,3];
3912  lcCongasing = _CuentasCd[ln_i, 4];
3913  lcConirpf = _CuentasCd[ln_i, 5];
3914  lcSql += "insert into " + lcTablaCuentas + " (codigo, nombre, secundaria, divisa, congasing, conirpf) values ('"+lcCodigo+"' , '"+lcNombre+"' , '"+lcSecundar+"' , '"+lcDivisa+ "', '" + lcCongasing + "', '" + lcConirpf + "'); ";
3915 
3916  // Si la cuenta es de un proveedor o acreedor la inserto en la tabla de PROVEEDORES, ésta siempre estará vacía.
3917  if (lcCodigo.Substring(0, 3) == _PrefijoPro3 || lcCodigo.Substring(0, 3) == _PrefijoAcr3)
3918  {
3919  lcSql += "insert into " + lcTablaProveed + " (codigo, nombre, idioma) values ('" + lcCodigo + "' , '" + lcNombre + "', '000'); ";
3920  }
3921 
3922  // Si la cuenta es de un deudor (440) la inserto en la tabla de CLIENTES.
3923  if (lcCodigo.Substring(0, 3) == _PrefijoDeudor3 )
3924  {
3925  lcSql += "insert into " + lcTablaClientes + " (codigo, nombre, idioma) values ('" + lcCodigo + "' , '" + lcNombre + "', '000'); ";
3926  }
3927  }
3928  DB.SQLExec(lcSql);
3929 
3930  // Revisar cuentas contables de tipos de iva que es una tabla que se pasa entera con datos, podría tener cuentas de IVA no standar que no vengan en el CD.
3931  GrupoempTools.AjustarTablaCuentas_Paso2_TipoIva();
3932 
3933  // Revisar cuentas contables de tipos de retención que es una tabla que se pasa entera con datos, podría tener cuentas de RETENCION no standar que no vengan en el CD.
3934  GrupoempTools.AjustarTablaCuentas_Paso2_TipoRet();
3935 
3936  // Revisar cuentas de compras/ventas dolar que se guardan en EMPRESA, podría tener cuentas no standar que no vengan en el CD.
3937  GrupoempTools.AjustarTablaCuentas_Paso2_CuentasDolar();
3938 
3939  // Revisar cuentas de contrapartida declaradas en la ficha de cliente, podría tener cuentas no standar que no vengan en el CD.
3940  if (GrupoempTools._ConservarClientes)
3941  GrupoempTools.AjustarTablaCuentas_Paso2_Contrapar();
3942  }
3943 
3944 
3948  private static void AjustarTablaCuentas_Paso2_TipoIva()
3949  {
3950  DataTable ldtDatos = new DataTable();
3951 
3952  DB.SQLExec("select * from "+DB.SQLDatabaseReal(_DbEjerGrNuevo,"tipo_iva"), ref ldtDatos);
3953 
3954  foreach (DataRow loRow in ldtDatos.Rows)
3955  {
3956  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["CTA_IV_SOP"]));
3957  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["CTA_IV_REP"]));
3958  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["CTA_RE_SOP"]));
3959  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["CTA_RE_REP"]));
3960 
3961  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["PENDEVREP"]));
3962  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["PENDEDSOP"]));
3963  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["RECSOPCDEV"]));
3964  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["RECREPCDEV"]));
3965 
3966  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["PRTIVSOPND"]));
3967  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["PRTIVSNDPD"]));
3968  }
3969  return;
3970  }
3971 
3972 
3976  private static void AjustarTablaCuentas_Paso2_TipoRet()
3977  {
3978  DataTable ldtDatos = new DataTable();
3979 
3980  DB.SQLExec("select * from " + DB.SQLDatabaseReal(_DbEjerGrNuevo, "tipo_ret"), ref ldtDatos);
3981 
3982  foreach (DataRow loRow in ldtDatos.Rows)
3983  {
3984  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["CTA_RE_SOP"]));
3985  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["CTA_RE_REP"]));
3986  }
3987  return;
3988  }
3989 
3990 
3994  private static void AjustarTablaCuentas_Paso2_CuentasDolar()
3995  {
3996  DataTable ldtDatos = new DataTable();
3997 
3998  DB.SQLExec("select C_CTA_DOL, V_CTA_DOL from " + DB.SQLDatabaseReal(_DbEjerGrNuevo, "factucnf") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtDatos);
3999 
4000  if (ldtDatos.Rows.Count > 0)
4001  {
4002  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(ldtDatos.Rows[0]["C_CTA_DOL"]));
4003  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(ldtDatos.Rows[0]["V_CTA_DOL"]));
4004  }
4005 
4006  return;
4007  }
4008 
4009 
4013  private static void AjustarTablaCuentas_Paso2_Contrapar()
4014  {
4015  DataTable ldtDatos = new DataTable();
4016 
4017  DB.SQLExec("select distinct contrapar from " + DB.SQLDatabaseReal(_DbEjerGrNuevo, "clientes") + " where contrapar!=' '", ref ldtDatos);
4018 
4019  foreach (DataRow loRow in ldtDatos.Rows)
4020  {
4021  GrupoempTools.AjustarTablaCuentas_Paso2_ActualizarCuenta(Convert.ToString(loRow["contrapar"]));
4022  }
4023 
4024  return;
4025  }
4026 
4027 
4028  private static void AjustarTablaCuentas_Paso2_ActualizarCuenta(string tcCuenta)
4029  {
4030  if (string.IsNullOrWhiteSpace(tcCuenta))
4031  return;
4032 
4033  string lcZeros = new string('0', GrupoempTools._LenCuenta - 8); // Recordar que GrupoempTools._LenCuenta es la longitud del campo cuenta en el grupo origen.
4034 
4035  // Cuenta en el grupo origen podria tener anchura diferente a la que hay en el grupo nuevo.
4036  string tcCuentaOrigen = tcCuenta.Substring(0,4)+lcZeros+tcCuenta.Substring(4,4);
4037  string lcNombre="";
4038 
4039  DataTable ldtDatos = new DataTable();
4040 
4041  bool llOk = DB.SQLExec("select codigo from " + DB.SQLDatabaseReal(_DbEjerGrNuevo, "cuentas") + " where codigo='" + tcCuenta + "'", ref ldtDatos);
4042 
4043  if (ldtDatos.Rows.Count == 0)
4044  {
4045  llOk = DB.SQLExec("select codigo,nombre from " + DB.SQLDatabaseReal(_DbEjerGrOrigen, "cuentas") + " where codigo='" + tcCuentaOrigen + "'", ref ldtDatos);
4046  if (ldtDatos.Rows.Count>0)
4047  lcNombre = Convert.ToString(ldtDatos.Rows[0]["nombre"]);
4048  else
4049  lcNombre = "CUENTA CONTABLE "+tcCuenta;
4050 
4051  llOk = DB.SQLExec("insert into " + DB.SQLDatabaseReal(_DbEjerGrNuevo, "cuentas") + " (codigo, nombre, secundaria) values ("+
4052  "'"+tcCuenta+"',"+
4053  "'"+lcNombre+"',"+
4054  "'N')");
4055 
4056  }
4057 
4058  return;
4059  }
4060 
4061 
4069  private static bool CrearGrupo_AjustarDatos_TablaAddon(string tcTabla, string tcNombreBaseDatos, string tcNombreAddon)
4070  {
4071  string lcSql = "", lcVarAuxi = "";
4072  DataTable ldtAuxiliar = new DataTable();
4073 
4074 
4075  switch (tcNombreAddon)
4076  {
4077  case "TPV":
4078 
4079  //lstTablasEspeciales = new List<string>() {"CAJAS","CAJ_FCOB","CONFTICK","CONFTPV","CONFVAL","CONT_TPV",
4080  // "F_COBROS","OPCFLAG","OPCEMP"};
4081 
4082  switch (tcTabla)
4083  {
4084  case "CAJAS":
4085  // Vaciar tabla y dejar solo la caja 0001 como en la instalacion
4086  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CAJAS"));
4087 
4088  string lcCuentaCobro = "555" + new string('0', _LenCuenta - 3);
4089  string lcCuentaPago = "555" + new string('0', _LenCuenta - 4) + "1";
4090  string lcCuentaReposicion = "555" + new string('0', _LenCuenta - 4) + "2";
4091  string lcCuentaRetirado = "555" + new string('0', _LenCuenta - 4) + "2";
4092  string lcCuentaCliente = GrupoempTools._PrefijoCli3 + new string('0', _LenCuenta - 4) + "1";
4093 
4094  // Crear registro para la caja 0001
4095  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CAJAS") + " " +
4096  "(CODIGO,NOMBRE, COBRO, PAGO, REPOSICION, RETIRADO, OPERARIO, VENDEDOR, CLIENTE, TIPO_DOC) VALUES " +
4097  "('0001','CAJA 0001','" + lcCuentaCobro + "','" + lcCuentaPago + "','" + lcCuentaReposicion + "','" + lcCuentaRetirado + "','01','01'," +
4098  "'" + lcCuentaCliente + "',1)";
4099  DB.SQLExec(lcSql);
4100 
4101  break;
4102 
4103  case "CAJ_FCOB":
4104 
4105  // Vaciar tabla y dejar solo la caja 0001 como en la instalacion
4106  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CAJ_FCOB"));
4107 
4108  // Crear registros para las formas de cobro
4109  lcVarAuxi = _PrefijoCaj3 + new string('0', GrupoempTools._LenCuenta - 3);
4110  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CAJ_FCOB") + " " +
4111  "(EMPRESA,CAJA, FORMA_COB, CUENTA) VALUES " +
4112  "('" + _EmpresaGrNuevo + "','0001','01','" + lcVarAuxi + "')";
4113  DB.SQLExec(lcSql);
4114 
4115  lcVarAuxi = _PrefijoBan3 + new string('0', GrupoempTools._LenCuenta - 3);
4116  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CAJ_FCOB") + " " +
4117  "(EMPRESA,CAJA, FORMA_COB, CUENTA) VALUES " +
4118  "('" + _EmpresaGrNuevo + "','0001','02','" + lcVarAuxi + "')";
4119  DB.SQLExec(lcSql);
4120 
4121  lcVarAuxi = "414" + new string('0', GrupoempTools._LenCuenta - 3);
4122  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CAJ_FCOB") + " " +
4123  "(EMPRESA,CAJA, FORMA_COB, CUENTA) VALUES " +
4124  "('" + _EmpresaGrNuevo + "','0001','03','" + lcVarAuxi + "')";
4125  DB.SQLExec(lcSql);
4126 
4127  break;
4128 
4129  case "CONFTICK":
4130 
4131  // Borramos los registros que no sean de la empresa
4132  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFTICK") + " WHERE EMPRESA!='" + _EmpresaGrNuevo + "'");
4133 
4134  // Comrpobamos que exista el registro de la empresa que nos interesa, caso de no existir lo creamos.
4135  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFTICK") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
4136  if (ldtAuxiliar.Rows.Count == 0)
4137  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFTICK") + " (empresa,cobro) values ('" + _EmpresaGrNuevo + "',"+DB.SQLTrue()+")");
4138 
4139  // Actualizamos campos
4140  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFTICK") + " " +
4141  "SET TICKETS=0, ARQUEO=0, FACTICK=0, PEDINT=0 " +
4142  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
4143  DB.SQLExec(lcSql);
4144  break;
4145 
4146  case "CONFTPV":
4147  // Borramos los registros que no sean de la empresa
4148  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFTPV") + " WHERE EMPRESA!='" + _EmpresaGrNuevo + "'");
4149 
4150  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFTPV") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
4151  if (ldtAuxiliar.Rows.Count == 0)
4152  {
4153  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFTPV") + " " +
4154  "(empresa, cobcaja, abcaja, tickalb, vendedor, almacen, cantidad, precio, vale, hora_ini, hora_fin, credito, dev_efect) " +
4155  "values ('" + _EmpresaGrNuevo + "', " + DB.SQLTrue() + ", " + DB.SQLTrue() + ",'TRASPASO HACIA ALBARAN', " +
4156  DB.SQLTrue() + ", " + DB.SQLTrue() + ", " + DB.SQLTrue() + ", " + DB.SQLTrue() + ", '03', '09:00', '20:00', " +
4157  DB.SQLTrue() + ", " + DB.SQLTrue() + ")");
4158  }
4159 
4160  // Actualizamos campos
4161  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFTPV") + " " +
4162  "SET ART_MENU='', ART_RESERVA='', FAM_POST='', TARIFASUP='', PL_SERVER='' " +
4163  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
4164  DB.SQLExec(lcSql);
4165  break;
4166 
4167  case "CONFVAL":
4168  // Borramos los registros que no sean de la empresa
4169  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFVAL") + " WHERE EMPRESA!='" + _EmpresaGrNuevo + "'");
4170 
4171  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFVAL") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
4172  if (ldtAuxiliar.Rows.Count == 0)
4173  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFVAL") + " (empresa) values ('" + _EmpresaGrNuevo + "')");
4174 
4175  // Actualizamos campos
4176  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFVAL") + " " +
4177  "SET MENSAJE='', CADUCIDAD=0 " +
4178  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
4179  DB.SQLExec(lcSql);
4180  break;
4181 
4182  case "F_COBROS":
4183 
4184  // Vaciar tabla y dejar solo la caja 0001 como en la instalacion
4185  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "F_COBROS"));
4186 
4187  // Crear registros para las formas de cobro
4188  lcVarAuxi = _PrefijoCaj3 + new string('0', GrupoempTools._LenCuenta - 3);
4189  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "F_COBROS") + " " +
4190  "(CODIGO, NOMBRE, MONEDA, CUENTA, EFECTIVO ) VALUES " +
4191  "('01' , 'CONTADO' , '000' , '" + lcVarAuxi + "'," + DB.SQLTrue() + ")";
4192  DB.SQLExec(lcSql);
4193 
4194  lcVarAuxi = _PrefijoBan3 + new string('0', GrupoempTools._LenCuenta - 3);
4195  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "F_COBROS") + " " +
4196  "(CODIGO, NOMBRE, MONEDA, CUENTA, EFECTIVO) VALUES " +
4197  "('02' , 'TARJETAS' , '000' , '" + lcVarAuxi + "'," + DB.SQLFalse() + ")";
4198  DB.SQLExec(lcSql);
4199 
4200  lcVarAuxi = "414" + new string('0', GrupoempTools._LenCuenta - 3);
4201  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "F_COBROS") + " " +
4202  "(CODIGO, NOMBRE, MONEDA, CUENTA, EFECTIVO ) VALUES " +
4203  "('03', 'VALES' , '000' , '" + lcVarAuxi + "' ," + DB.SQLFalse() + ")";
4204  DB.SQLExec(lcSql);
4205  break;
4206 
4207  case "OPCEMP":
4208  // Borramos los registros que no sean de la empresa
4209  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " WHERE EMPRESA!='" + _EmpresaGrNuevo + "'");
4210  break;
4211 
4212  }
4213  break;
4214 
4215  case "MAYORIST":
4216  case "AMORTIZA":
4217 
4218  // En AMORTIZA y MAYORIST solo se respeta el contenido de las tablas de sistema que estan declaradas en la tabla TABSYS del propio módulo y se vacian el resto.
4219  break;
4220 
4221  case "INFORAUT":
4222 
4223  // lstTablasEspeciales = new List<string>() {"IAOPCEMP","LICENCIA","IACONFIG";
4224  switch (tcTabla)
4225  {
4226  case "IAOPCEMP":
4227  // Borramos los registros que no sean de la empresa
4228  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "IAOPCEMP") + " WHERE EMPRESA!='" + _EmpresaGrNuevo + "'");
4229 
4230  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "IAOPCEMP") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
4231  if (ldtAuxiliar.Rows.Count == 0)
4232  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "IAOPCEMP") + " (empresa) values ('" + _EmpresaGrNuevo + "')");
4233 
4234  break;
4235 
4236  case "LICENCIA":
4237  // No hacemos nada, dejamos la misma licencia que habia en el grupo origen del que viene el nuevo grupo que estamos creando.
4238 
4239  // Actualizamos campos
4240  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "LICENCIA") + " " +
4241  "SET INSTAL=" + DB.SQLString(DateTime.Today.Date);
4242  DB.SQLExec(lcSql);
4243  break;
4244 
4245  case "IACONFIG":
4246  // Borramos los registros que no sean de la empresa
4247  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "IACONFIG") + " WHERE EMPRESA!='" + _EmpresaGrNuevo + "'");
4248 
4249  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "IACONFIG") + " where empresa='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
4250  if (ldtAuxiliar.Rows.Count == 0)
4251  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "IACONFIG") + " (empresa) values ('" + _EmpresaGrNuevo + "')");
4252 
4253  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "IACONFIG") + " " +
4254  "SET NOMBREMAIL='', MAIL='', SMTP='', USERMAIL='', CLAVEMAIL='', IMPRESORA='', PUERTO='', TIEMPOLIS=15, TIEMPOPRO=240, SERVERPORT=0, CIFRADOSSL=" + DB.SQLFalse() + ", ESCRYPT=" + DB.SQLFalse() + " " +
4255  "WHERE EMPRESA='" + _EmpresaGrNuevo + "'";
4256  DB.SQLExec(lcSql);
4257  break;
4258 
4259  }
4260 
4261  break;
4262 
4263  case "LOTES":
4264 
4265  // lstTablasEspeciales = new List<string>() {"CONFIGURA","CONTADOR","REVCONF","TIPOALM"};
4266  switch (tcTabla)
4267  {
4268  case "CONFIGURA":
4269  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFIGURA"));
4270 
4271  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFIGURA") + " " +
4272  " (empresa) values ('" + _EmpresaGrNuevo + "')");
4273 
4274  // Actualizamos campos
4275  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONFIGURA") + " " +
4276  "SET CONTADOR=0, TIPO_REG='', PRE_CONT='', CONSUMIR=" + DB.SQLTrue()+", " +
4277  "STOCKS2=" + DB.SQLTrue() + ", SINCAD=" + DB.SQLTrue();
4278  DB.SQLExec(lcSql);
4279  break;
4280 
4281  case "CONTADOR":
4282  // Dejaremos solamente los registros de la empresa y serie SF
4283  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "CONTADOR"));
4284 
4285  string lcTabCont = DB.SQLDatabaseReal(tcNombreBaseDatos, "CONTADOR");
4286 
4287  lcSql = "INSERT INTO " + lcTabCont + " (EMPRESA,SERIE,TIPODOC) VALUES ('" + _EmpresaGrNuevo + "','SF',1);";
4288  lcSql += "INSERT INTO " + lcTabCont + " (EMPRESA,SERIE,TIPODOC) VALUES ('" + _EmpresaGrNuevo + "','SF',2);";
4289 
4290  DB.SQLExec(lcSql);
4291 
4292  break;
4293 
4294  case "REVCONF":
4295  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "REVCONF"));
4296 
4297  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "REVCONF") + " " +
4298  "(empresa, revpeso, revzona) values ('" + _EmpresaGrNuevo + "', " +
4299  DB.SQLTrue()+","+DB.SQLFalse()+")");
4300 
4301  break;
4302 
4303  case "TIPOALM":
4304  // Borramos los registros que no sean de la empresa
4305  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, "TIPOALM") + " WHERE CODIGO!='" + _EmpresaGrNuevo + "'");
4306 
4307  DB.SQLExec("select codigo from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "TIPOALM") + " where codigo='" + _EmpresaGrNuevo + "'", ref ldtAuxiliar);
4308  if (ldtAuxiliar.Rows.Count == 0)
4309  DB.SQLExec("insert into " + DB.SQLDatabaseReal(tcNombreBaseDatos, "TIPOALM") + " (codigo) values ('" + _EmpresaGrNuevo + "')");
4310 
4311  break;
4312 
4313  }
4314  break;
4315 
4316  // Bug 152782
4317  case "IDATOS":
4318 
4319  switch (tcTabla)
4320  {
4321  case "PLINTER_C":
4322  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE REGBASE50 = " + DB.SQLFalse() + "");
4323  break;
4324 
4325  case "PLINTER_D":
4326  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE REGBASE50 = " + DB.SQLFalse() + "");
4327  break;
4328 
4329  case "PLINTER_D1":
4330  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE REGBASE50 = " + DB.SQLFalse() + "");
4331  break;
4332 
4333  case "PLINTER_D2":
4334  DB.SQLExec("DELETE FROM " + DB.SQLDatabaseReal(tcNombreBaseDatos, tcTabla) + " WHERE REGBASE50 = " + DB.SQLFalse() + "");
4335  break;
4336 
4337  }
4338  break;
4339 
4340  }
4341 
4342  return true;
4343  }
4344 
4352  private static List<string> CrearGrupoEjer_Tablas_Especiales(string tcTipoBd, string tcNombreAddon = "")
4353  {
4354  List<string> lstTablasEspeciales = null;
4355 
4356  switch (tcTipoBd)
4357  {
4358  case "COMUNES":
4359  // COMUNES.ACCESOLIC en principio mantener lo que haya en el grupo origen puesto que la licencia no cambia, en esta tabla hay un registro para COMUNES y para cada addon instalado
4360  // Como al nuevo grupo solo van a parar los addons estandar podria ser que quedase algun registro en ACCESOLIC del nuevo grupo correspondiente a un modulo que no tenga en COMUNES!MODULOS
4361  // pero no deberia afectar pues al ser la misma licencia el MD5 estara calculado correctamente == > No borrar ACCESOLIC
4362 
4363  lstTablasEspeciales = new List<string>() {"ACCESOLIC", "CODCOM", "EJERCICI","FORMULS", "LETRAS", "LICENCIA", "MODULOS","OPERARIO","OPC_USER", "OPCEMP", "OPCESPUS",
4364  "PERF_USERS","PRGS", "OPCINDICA","USRDESKTOP", "USRBROWSER", "USRWIDGET", "USUARIOS",
4365  "ACCE_MON","COMPRCNF", "DATA_IV2", "DATA_RE2", "OTROSCFG","FPAG_GIR","VARIABLE", "ASINOM","ASIDEFIN", "PLSEPA_C", "PLSEPA_D"};
4366  break;
4367 
4368  case "GESTION":
4369  lstTablasEspeciales = new List<string>() {"ACCESOS","ALMACEN","CFGFACT","CODIGOS","CONTACNF","CONTADOR","COTIZA","DATA_IVA","DATA_RET","EMPRESA","FACTUCNF","FAMILIAS", "FLAGS",
4370  "LLIS_PER","LLIS_RET","MARCAS","MENUS","MESES","PLTCOMU", "PROGRAMS", "SERIES","TIPO_RET",
4371  "ACTI_CLI","ACTIVI", "AGENCIA", "BANC_CLI","CIA_CRED","CLIENTES","CONTLF_CLI","CONT_CLI","CUENTAS","ENV_CLI","FPAG","GIRO_CLI","IDIOMA","RUTAS",
4372  "TELF_CLI","TIPO_FAC","VACA_CLI","VENDEDOR","RET_EMP", "TARIFAS", "ASINOM", "ASIDEFIN"};
4373  break;
4374 
4375  case "ADDON":
4376  {
4377  switch (tcNombreAddon)
4378  {
4379  case "TPV":
4380  lstTablasEspeciales = new List<string>() {"CAJAS","CAJ_FCOB","CONFIGERP","CONFTICK","CONFTPV","CONFVAL","CONT_TPV",
4381  "F_COBROS","OPCEMP"};
4382 
4383  break;
4384  case "INFORAUT":
4385  lstTablasEspeciales = new List<string>() { "IAOPCEMP", "LICENCIA", "IACONFIG" };
4386  break;
4387  case "MAYORIST":
4388  lstTablasEspeciales = new List<string>() { };
4389  break;
4390  case "LOTES":
4391  lstTablasEspeciales = new List<string>() { "CONFIGURA", "CONTADOR", "REVCONF", "TIPOALM" };
4392  break;
4393  // Bug 152782
4394  case "IDATOS":
4395  lstTablasEspeciales = new List<string>() { "PLINTER_C", "PLINTER_D", "PLINTER_D1", "PLINTER_D2" };
4396  break;
4397  // Bug 131839 - Para cualquier otro addon, crear la lista vacia
4398  default:
4399  lstTablasEspeciales = new List<string>() { };
4400  break;
4401  }
4402  break;
4403  }
4404  }
4405  return lstTablasEspeciales;
4406  }
4407 
4415  private static bool AjustarDatos_Bd(string tcNombreBaseDatos, string tcTipoBaseDatos, string tcNombreAddon="")
4416  {
4417  string lcSql = "", lcTabla="";
4418 
4419  // En la tabla COMUNES!TABSYS guardamos las tablas de COMUNES y GESTION que son de sistema y no deben borrarse, por tanto en el nuevo grupo se respetará su contenido
4420  // En el caso de los Addons tambien existe la tabla TABSYS. De momento Sage50 instala 5 addons de forma predeterminada aunque no tienen por estar visibles (TPV, AMORTIZA, MAYORIST, LOTES, INFORAUT)
4421 
4422  // El proceso de ajuste de datos revisa todas las tablas de la base de datos y si la detectada en la lista de tabla que no deben borrarse la deja igual, y si detecta que está en la lista
4423  // de tablas a las que hay que aplicar algún proceso, la procesa.
4424 
4425  if (_Log)
4426  Guardar_Mensaje("INICIO PROCESO DE AJUSTE DE DATOS EN LA BASE DE DATOS DE " + tcTipoBaseDatos + " [" + tcNombreBaseDatos+"] "+tcNombreAddon+Environment.NewLine);
4427 
4428 
4429 
4430 
4431  // TABLAS DE SISTEMA QUE NO DEBEN BORRARSE, CONSULTAR TABSYS
4432  DataTable ldtTablasNoborr = new DataTable();
4433  lcSql = "select tabla from " + DB.SQLDatabaseReal( tcTipoBaseDatos == "COMUNES" || tcTipoBaseDatos == "GESTION" ? _DbComunesGrNuevo : tcNombreBaseDatos,"tabsys")+" "+
4434  (tcTipoBaseDatos == "COMUNES" || tcTipoBaseDatos == "GESTION" ? "where basedatos='" + tcTipoBaseDatos + "'" : "");
4435  DB.SQLExec(lcSql, ref ldtTablasNoborr);
4436  List<string> lstTablasNoBorr = ldtTablasNoborr.AsEnumerable().Select(x => x[0].ToString().Trim().ToUpper()).ToList();
4437 
4438  if (_Log)
4439  Guardar_Mensaje("Detectadas " + lstTablasNoBorr.Count.ToString() + " tablas de sistema en la base de datos de " + tcTipoBaseDatos + " (" + tcNombreBaseDatos + ")" + tcNombreAddon + " cuyo contenido no debe borrarse.");
4440 
4441 
4442 
4443 
4444  // TABLAS CON ALGUN TRATAMIENTO ESPECIAL A REALIZAR
4445 
4446  // Tratamientos: eliminar registros de empresas sobrantes, eliminar registros de usuarios diferentes de SUPERVISOR,
4447  // poner contadores a 0
4448  List<string> lstTablasEspeciales = null;
4449 
4450  lstTablasEspeciales = GrupoempTools.CrearGrupoEjer_Tablas_Especiales(tcTipoBaseDatos, tcNombreAddon);
4451 
4452  // Cualquier tabla que esté en cualquiera de las dos listas anteriores (lstTablasNoBorr, lstTablasEspeciales) no se borrará.
4453 
4454  // OBTENER TODAS LAS TABLAS DE LA BASE DE DATOS
4455  if (_Log)
4456  Guardar_Mensaje("Consultando tablas existentes en la base de datos de "+tcTipoBaseDatos+" "+tcNombreAddon+" "+tcNombreBaseDatos);
4457 
4458  DataTable ldtTablasBd = new DataTable();
4459  try
4460  {
4461  lcSql = "SELECT table_name as tabla " +
4462  "FROM [" + tcNombreBaseDatos + "].INFORMATION_SCHEMA.TABLES " +
4463  "ORDER BY table_name ";
4464  DB.SQLExec(lcSql, ref ldtTablasBd);
4465  }
4466  catch (Exception loEx)
4467  {
4468  if (_Log)
4469  {
4470  Guardar_Mensaje("No se puedieron obtener las tablas existentes en la base de datos de " + tcTipoBaseDatos + " " + tcNombreBaseDatos);
4471  Guardar_Mensaje(loEx.Message);
4472  }
4473  }
4474 
4475  // PROCESAR CADA UNA DE LAS TABLAS DE LA BASE DE DATOS
4476 
4477  // Nos recorremos las tablas de la base de datos y si la tabla en questión no está ni en la lista de tablas no borrables,
4478  // ni está en la lista de tablas a la que realizar algún proceso, la vacíaremos.
4479  foreach (DataRow loRow in ldtTablasBd.Rows)
4480  {
4481  lcTabla = Convert.ToString(loRow["tabla"]).Trim().ToUpper();
4482 
4483  if (!string.IsNullOrWhiteSpace(lcTabla) && !lstTablasNoBorr.Contains(lcTabla) && lstTablasEspeciales != null && !lstTablasEspeciales.Contains(lcTabla))
4484  {
4485  // No está en la lista de tablas a respetar enteramente su contenido ni tampoco está en la lista de tablas
4486  // que hay que hacer algún proceso, por tanto borramos su contenido.
4487  if (_Log)
4488  Guardar_Mensaje("Eliminando contenido de la tabla " + tcNombreBaseDatos+"."+lcTabla);
4489  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(tcNombreBaseDatos, lcTabla));
4490  }
4491  else
4492  {
4493  // La tabla está en la lista de tablas que hay que hacer algún proceso, por tanto, a procesarla.
4494  if (lstTablasEspeciales.Contains(lcTabla))
4495  {
4496  if (_Log)
4497  Guardar_Mensaje("Ajustando datos en la tabla de " + tcTipoBaseDatos + " " + tcNombreAddon + " " + tcNombreBaseDatos + "." + lcTabla);
4498 
4499  try
4500  {
4501  switch (tcTipoBaseDatos)
4502  {
4503  case "COMUNES":
4504  GrupoempTools.CrearGrupo_AjustarDatos_TablaComunes(lcTabla, tcNombreBaseDatos);
4505  break;
4506  case "GESTION":
4507  GrupoempTools.CrearGrupoEjer_AjustarDatos_TablaGestion(lcTabla, tcNombreBaseDatos);
4508  break;
4509  case "ADDON":
4510  GrupoempTools.CrearGrupo_AjustarDatos_TablaAddon(lcTabla, tcNombreBaseDatos, tcNombreAddon);
4511  break;
4512  }
4513  }
4514  catch (Exception loEx)
4515  {
4516  if (_Log)
4517  {
4518  Guardar_Mensaje("No se puedieron realizar los ajustes en la tabla de la base de datos de " + tcTipoBaseDatos + " " + tcNombreAddon+" "+tcNombreBaseDatos+"."+lcTabla);
4519  Guardar_Mensaje(loEx.Message);
4520  }
4521  }
4522  }
4523 
4524  // Tabla con datos, recalcular los campos GUID_ID, CREATED, MODIFIED pues no pueden coincidir con los del grupo origen
4525  // utilizado para la creación del grupo. En GUID_ID se pone NEWID() y en CREATED y MODIFIED se pone la fechahora actual con GETDATE()
4526  GrupoempTools.Actualizar_CamposGuidId(tcNombreBaseDatos, lcTabla);
4527  }
4528  }
4529 
4530  if (_Log)
4531  {
4532  Guardar_Mensaje(Environment.NewLine);
4533  Guardar_Mensaje("FIN PROCESO DE AJUSTE DE DATOS EN LA BASE DE DATOS DE " + tcTipoBaseDatos + " [" + tcNombreBaseDatos + "] " + tcNombreAddon + Environment.NewLine);
4534  }
4535 
4536  return true;
4537  }
4538 
4545  private static bool Actualizar_CamposGuidId(string tcNombreBdReal, string tcTabla)
4546  {
4547  string lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBdReal, tcTabla) + " " +
4548  "SET GUID_ID=NEWID(), CREATED=GETDATE(), MODIFIED=GETDATE() ";
4549  bool llOk = DB.SQLExec(lcSql);
4550 
4551  return llOk;
4552  }
4553 
4559  private static bool BorrarGrupo_Comprobaciones_Previas(string tcGrupo)
4560  {
4561  string lcSql = "";
4562 
4563  if (_Log)
4564  Guardar_Mensaje("Conexión activa antes de borrar el grupo: " + DB.DbComunes);
4565 
4566  // Comprobamos que pasen bien el código de grupo a crear.
4567  if (string.IsNullOrWhiteSpace(tcGrupo))
4568  {
4569  _Error_Message = "No se ha recibido el parámetro código de grupo a borrar.";
4570  if (_Log)
4571  Guardar_Mensaje(_Error_Message);
4572  return false;
4573  }
4574 
4575  // Si no existe la tabla acabo, esto no debería ocurrir en ningún caso pero se comprueba para evitar la petada si fuera el caso.
4576  if (DB._SQLExisteTablaBBDD("EUROWINSYS", "GRUPOSEMP") == false)
4577  {
4578  _Error_Message = "No se ha detectado la tabla gruposemp, no se borrará el grupo " + tcGrupo;
4579  if (_Log)
4580  Guardar_Mensaje(_Error_Message);
4581  return false;
4582  }
4583  if (_Log)
4584  Guardar_Mensaje("Tabla GruposEmp: OK.");
4585 
4586 
4587  // Comprobar que el grupo exista en EUROWINSYS.GRUPOSEMP, sino ya no empezamos bien y cancelo.
4588  DataTable ldtGrupos = new DataTable();
4589  lcSql = "SELECT * FROM [EUROWINSYS].[dbo].[gruposemp] where codigo=" + DB.SQLString(tcGrupo);
4590  DB.SQLExec(lcSql, ref ldtGrupos);
4591  if (ldtGrupos.Rows.Count == 0)
4592  {
4593  _Error_Message = "No se ha detectado el grupo a eliminar en la tabla eurowinsys.gruposemp, no se eliminará el grupo.";
4594  if (_Log)
4595  Guardar_Mensaje(_Error_Message);
4596  // Como estamos borrando el grupo, si no tiene el registro en gruposemp NO será motivo suficiente para no eliminar el grupo y continuaremos.
4597  }
4598  else
4599  {
4600  if (_Log)
4601  Guardar_Mensaje("El grupo a eliminar " + tcGrupo + " existe en la tabla de grupos GruposEmp: OK.");
4602  }
4603 
4604 
4605  // Compruebo que no sea grupo origen.
4606  // Si el intento del borrado del grupo se hace desde Sage50 desde el formulario de mantenimiento de grupos
4607  // ya controla desde allí y no debería llegar aquí, en cambio,
4608  // si la llamada se hace externamente a Sage50 (p.e. desde otro software), hay que hacer la comprobación.
4609  if (ldtGrupos.Rows.Count > 0)
4610  {
4611  bool llPripal = Convert.ToBoolean(ldtGrupos.Rows[0]["pripal"]);
4612  if (llPripal)
4613  {
4614  _Error_Message = "El grupo que se pretende eliminar está marcado como grupo principal en la tabla de grupos GRUPOSEMP y no puede eliminarse.";
4615  if (_Log)
4616  Guardar_Mensaje(_Error_Message);
4617  return false;
4618  }
4619  if (_Log)
4620  Guardar_Mensaje("El grupo a eliminar " + tcGrupo + " no es grupo principal: OK.");
4621  }
4622 
4623 
4624  // Verificar que el grupo que se pretende eliminar no es el grupo activo.
4625  GrupoempTools._DbComunesGrBorrar = "COMU" + tcGrupo;
4626  if (_Log)
4627  Guardar_Mensaje("Base de datos de COMUNES del grupo a eliminar: "+_DbComunesGrBorrar);
4628 
4629  if (DB.DbComunes.ToUpper().Trim() == _DbComunesGrBorrar.ToUpper().Trim())
4630  {
4631  _Error_Message = "Para eliminar el grupo " + tcGrupo + " éste no debe ser el grupo activo de la conexión al servidor SQL, debe estar conectado a otro grupo.";
4632  if (_Log)
4633  Guardar_Mensaje(_Error_Message);
4634  return false;
4635  }
4636  if (_Log)
4637  Guardar_Mensaje("El grupo a eliminar " + tcGrupo + " no es el grupo activo: OK.");
4638 
4639 
4640  // Comprobar que existe la base de COMUNES del grupo a eliminar.
4641  if (_Log)
4642  Guardar_Mensaje("Verificando existencia de base de datos " + GrupoempTools._DbComunesGrBorrar);
4643  if (DB._SQLExisteBBDD(_DbComunesGrBorrar))
4644  {
4645  if (_Log)
4646  Guardar_Mensaje("Base de datos COMUNES " + GrupoempTools._DbComunesGrBorrar + " existe en el servidor: OK");
4647  }
4648  else
4649  {
4650  _Error_Message = "Base de datos COMUNES " + GrupoempTools._DbComunesGrBorrar + " no existe en el servidor.";
4651  if (_Log)
4652  Guardar_Mensaje(_Error_Message);
4653  return false;
4654  }
4655 
4656 
4657  // Buscamos las bd de los ejercicios y las guardamos en un DataTable.
4658  GrupoempTools._dtBdEjerGrBorrar = new DataTable();
4659  if (_Log)
4660  Guardar_Mensaje("Obteniendo bases de datos de ejercicios de " + GrupoempTools._DbComunesGrBorrar);
4661  DB.SQLExec("select * from " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrBorrar, "ejercici"), ref _dtBdEjerGrBorrar);
4662  if (_Log)
4663  {
4664  Guardar_Mensaje("Detectados " + _dtBdEjerGrBorrar.Rows.Count.ToString() + " ejercicios.");
4665  if (_dtBdEjerGrBorrar.Rows.Count > 0)
4666  {
4667  foreach (DataRow loRow in _dtBdEjerGrBorrar.Rows)
4668  Guardar_Mensaje(Convert.ToString(loRow["conexion"]));
4669  }
4670  }
4671 
4672 
4673  // Buscamos las bd. de los Add-ons y las guardamos en un DataTable.
4674  GrupoempTools._dtBdAddonsGrBorrar = new DataTable();
4675  if (_Log)
4676  Guardar_Mensaje("Obteniendo bases de datos de Add-ons " + GrupoempTools._DbComunesGrBorrar);
4677  DB.SQLExec("select nom_conex,nombre from " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrBorrar, "modulos"), ref GrupoempTools._dtBdAddonsGrBorrar);
4678  if (_Log)
4679  {
4680  Guardar_Mensaje("Detectados " + GrupoempTools._dtBdAddonsGrBorrar.Rows.Count.ToString() + " Add-ons.");
4681  if (_dtBdAddonsGrBorrar.Rows.Count>0)
4682  {
4683  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrBorrar.Rows)
4684  Guardar_Mensaje(Convert.ToString(loRow["nom_conex"]));
4685  }
4686  }
4687 
4688  return true;
4689  }
4690 
4691 
4699  private static bool CrearGrupo_Comprobar_TabSys(string tcTipoBd, string tcNombreBd, string tcComentario = "")
4700  {
4701  DataTable ldtAuxi = new DataTable();
4702 
4703  // Existencia de la tabla TABSYS en la base de datos
4704  if (!DB._SQLExisteTablaBBDD(tcNombreBd, "tabsys"))
4705  {
4706  _Error_Message = "No se ha detectado la existencia de la tabla TABSYS en la base de datos de "+tcTipoBd+" "+tcComentario.Trim() +
4707  " ("+tcNombreBd+") del grupo origen "+_GrupoOrigen;
4708  if (_Log)
4709  Guardar_Mensaje(_Error_Message);
4710  return false;
4711  }
4712 
4713  // Se verifica que si existe la tabla, además tenga registros.
4714  DB.SQLExec("select * from " + DB.SQLDatabaseReal(tcNombreBd, "tabsys") + " where tabla!='' order by basedatos,tabla", ref ldtAuxi);
4715  if (ldtAuxi.Rows.Count == 0)
4716  {
4717  _Error_Message = "Se ha detectado la existencia de la tabla TABSYS en la base de datos " + tcTipoBd + " " + tcComentario.Trim() +
4718  " (" + tcNombreBd + ") del grupo origen " + _GrupoOrigen + ", pero ésta no tiene ningún registro y debería tener datos.";
4719  if (_Log)
4720  Guardar_Mensaje(_Error_Message);
4721  return false;
4722  }
4723 
4724  return true;
4725  }
4726 
4727 
4736  private static int CrearGrupo_Obtener_LenCampo(string tcBd, string tcTabla, string tcComentLog, int tnAnchoMinimo)
4737  {
4738  DataTable ldtAuxiliar = new DataTable();
4739  int lnAncho = 0;
4740 
4741  DB.SQLExec("select top 1 codigo from " + DB.SQLDatabaseReal(tcBd, tcTabla) + " order by codigo desc", ref ldtAuxiliar);
4742  if (ldtAuxiliar.Rows.Count == 1)
4743  {
4744  lnAncho = Convert.ToString(ldtAuxiliar.Rows[0]["codigo"]).Length;
4745  if (lnAncho < tnAnchoMinimo )
4746  {
4747  lnAncho = tnAnchoMinimo;
4748  if (_Log)
4749  Guardar_Mensaje("Núm. dígitos " + tcComentLog + " = " + lnAncho.ToString().Trim() + " obtenido de forma anómala.");
4750 
4751  }
4752  else
4753  {
4754  if (_Log)
4755  Guardar_Mensaje("Núm. dígitos " + tcComentLog + " = " + lnAncho.ToString().Trim());
4756  }
4757  }
4758  else
4759  {
4760  lnAncho = tnAnchoMinimo;
4761  if (_Log)
4762  Guardar_Mensaje("Núm. dígitos " + tcComentLog + " = " + lnAncho.ToString().Trim() + " obtenido de forma anómala (2).");
4763  }
4764 
4765  return lnAncho;
4766  }
4767 
4768 
4776  private static bool CrearEjercicio_Comprobaciones_Previas(string tcGrupoOrigen, string tcEjerOrigen, string tcEjerNuevo)
4777  {
4778  DataTable ldtAuxiliar = new DataTable();
4779 
4780  if (_Log)
4781  Guardar_Mensaje("INICIO PROCESO COMPROBACIONES PREVIAS ANTES DE PROCEDER A LA CREACION DEL NUEVO EJERCICIO" + Environment.NewLine);
4782 
4783  // La correcta recepción de estos parámetros ya se ha realizado anteriormente en el metodo CrearEjercicio_Comprobaciones_Parametros
4784 
4785 
4786  // La base de datos de COMUNES del grupo origen debe existir.
4787  GrupoempTools._GrupoOrigen = tcGrupoOrigen;
4788  GrupoempTools._DbComunesGrOrigen = "COMU" + tcGrupoOrigen.Trim();
4789  GrupoempTools._DbComunesGrNuevo = GrupoempTools._DbComunesGrOrigen;
4790  if (!DB._SQLExisteBBDD(_DbComunesGrOrigen))
4791  {
4792  _Error_Message = "No se ha detectado en el servidor SQL la base de datos de COMUNES (" + _DbComunesGrOrigen + ") asociada al grupo origen (" + _GrupoOrigen + "), no se creará el ejercicio " + tcEjerNuevo;
4793  if (_Log)
4794  Guardar_Mensaje(_Error_Message);
4795  return false;
4796  }
4797  if (_Log)
4798  {
4799  Guardar_Mensaje("Base de datos de COMUNES del grupo origen: " + _DbComunesGrOrigen);
4800  Guardar_Mensaje("Base de datos de COMUNES del grupo origen existe en el servidor SQL.");
4801  }
4802 
4803 
4804 
4805 
4806  // Buscamos las bd. de los Add-ons del grupo origen que reseguiremos después, en principio no hemos de hacer nada con ellas, pero ya las tendremos si surje alguna necesidad.
4807  if (_Log)
4808  Guardar_Mensaje("Obteniendo bases de datos de Add-ons de grupo origen " + GrupoempTools._GrupoOrigen + " (COMU" + _GrupoOrigen + ")");
4809  DB.SQLExec("select nom_conex,nombre from " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrOrigen, "modulos"), ref _dtBdAddonsGrOrigen);
4810  if (_Log)
4811  {
4812  Guardar_Mensaje("Detectados " + _dtBdAddonsGrOrigen.Rows.Count.ToString() + " Add-ons.");
4813  foreach (DataRow loRow in _dtBdAddonsGrOrigen.Rows)
4814  Guardar_Mensaje(Convert.ToString(loRow["nom_conex"]));
4815  }
4816 
4817 
4818 
4819 
4820  // Buscamos la base de datos que corresponde al ejercicio origen que nos han pasado como parámetro.
4821  DataTable ldtBdEjer = new DataTable();
4822  GrupoempTools._DbEjerGrOrigen = "";
4823  if (_Log)
4824  Guardar_Mensaje("Obteniendo base de datos de ejercicio "+tcEjerOrigen+" de " + _DbComunesGrOrigen+".EJERCICI");
4825  DB.SQLExec("select * from " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrOrigen, "ejercici") + " where [any]='" + tcEjerOrigen.Trim()+"'", ref ldtBdEjer);
4826  if (ldtBdEjer.Rows.Count == 1)
4827  {
4828  GrupoempTools._DbEjerGrOrigen = Convert.ToString(ldtBdEjer.Rows[0]["conexion"]).Trim();
4829  if (_Log)
4830  Guardar_Mensaje("Base de datos de EJERCICIO origen: " + GrupoempTools._DbEjerGrOrigen);
4831  }
4832  else
4833  {
4834  _Error_Message = "No se ha podido averiguar el nombre de la base de datos de ejercicio " + tcEjerOrigen + " en el grupo " + GrupoempTools._GrupoOrigen + ", imposible crear ejercicio " + tcEjerNuevo;
4835  if (_Log)
4836  Guardar_Mensaje(_Error_Message);
4837  return false;
4838  }
4839 
4840 
4841 
4842 
4843  // La base de datos de EJERCICIO origen debería existir en el servidor SQL
4844  if (!DB._SQLExisteBBDD(GrupoempTools._DbEjerGrOrigen))
4845  {
4846  _Error_Message = "La base de datos de EJERCICIO " + GrupoempTools._DbEjerGrOrigen + " que se utilizará como origen de la creación de ejercicio no existe en el servidor, imposible crear ejercicio.";
4847  if (_Log)
4848  Guardar_Mensaje(_Error_Message);
4849  return false;
4850  }
4851  if (_Log)
4852  Guardar_Mensaje("La base de datos de ejercicio "+ GrupoempTools._DbEjerGrOrigen+" que se utilizará como origen para la creación del ejercicio existe en el servidor SQL: OK");
4853 
4854 
4855 
4856 
4857 
4858  // El ejercicio que se pretende crear no debería estar declarado en COMUNES.EJERCICI del grupo
4859  if (_Log)
4860  Guardar_Mensaje("Verificando la inexistencia del ejercicio " + tcEjerNuevo + " que se pretende crear "+tcEjerNuevo);
4861  DB.SQLExec("select * from " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrOrigen, "ejercici") + " where [any]='" + tcEjerNuevo.Trim()+"'", ref ldtBdEjer);
4862  if (ldtBdEjer.Rows.Count >= 1)
4863  {
4864  _Error_Message = "El ejercicio que se pretende crear " + tcEjerNuevo + " ya existe en la tabla de ejercicios del grupo "+_GrupoOrigen+", imposible crear ejercicio " + tcEjerNuevo;
4865  if (_Log)
4866  Guardar_Mensaje(_Error_Message);
4867  return false;
4868  }
4869 
4870 
4871 
4872 
4873 
4874  // Obtener base de datos del nuevo ejercicio que se va a crear a partir del ejercicio origen, será concatenar el ejercicio + los 2 carácteres de la derecha existentes en la bd del ejercicio origen
4875  GrupoempTools._SufiBdEjerGrNuevo = GrupoempTools._DbEjerGrOrigen.Substring(4, 2);
4876  // Si el sufijo no está bien, paro.
4877  if (GrupoempTools._SufiBdEjerGrNuevo.Trim().Length != 2)
4878  {
4879  _Error_Message = "El sufijo del nombre de la base de datos del ejercicio origen "+_DbEjerGrOrigen+" no tiene el formato, debería tener 2 carácteres: "+GrupoempTools._SufiBdEjerGrNuevo;
4880  if (_Log)
4881  Guardar_Mensaje(_Error_Message);
4882  return false;
4883  }
4884 
4885 
4886 
4887 
4888  GrupoempTools._DbEjerGrNuevo = tcEjerNuevo.Trim() + _SufiBdEjerGrNuevo.Trim();
4889  if (string.IsNullOrWhiteSpace(GrupoempTools._DbEjerGrNuevo))
4890  {
4891  _Error_Message = "No se ha podido obtener el nombre de la base de datos de ejercicio a crear, imposible crear ejercicio " + tcEjerNuevo;
4892  if (_Log)
4893  Guardar_Mensaje(_Error_Message);
4894  return false;
4895  }
4896  if (_Log)
4897  Guardar_Mensaje("Asignado nombre a base de datos de EJERCICIO a crear: " + GrupoempTools._DbEjerGrNuevo);
4898 
4899 
4900 
4901 
4902  // La base de datos de EJERCICIO a crear no debería existir en el servidor SQL
4903  if (DB._SQLExisteBBDD(GrupoempTools._DbEjerGrNuevo))
4904  {
4905  _Error_Message = "La base de datos " + _DbEjerGrNuevo + " correspondiente al ejercicio nuevo a crear en el grupo (" + tcGrupoOrigen + ") ya existe en el servidor, imposible crear ejercicio.";
4906  if (_Log)
4907  Guardar_Mensaje(_Error_Message);
4908  return false;
4909  }
4910  if (_Log)
4911  Guardar_Mensaje("La base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo + " que se creará para el nuevo ejercicio no existe en el servidor SQL: OK");
4912 
4913 
4914 
4915  // tcCarpetaBackupServidorSql = lcCarpetaDataServidorSql.ToLower().Replace("\\data", "\\backup");
4916  GrupoempTools._CarpetaBackupServidorSql = DB._SQLRutaBackup();
4917  if (string.IsNullOrWhiteSpace(_CarpetaBackupServidorSql))
4918  {
4919  _Error_Message = "No se ha podido averiguar la carpeta de Backup del servidor SQL.";
4920  if (_Log)
4921  Guardar_Mensaje(_Error_Message);
4922  return false;
4923  }
4924 
4925  if (_Log)
4926  Guardar_Mensaje("Obtenida ruta de Backup en el servidor SQL " + _CarpetaBackupServidorSql + ": OK");
4927 
4928 
4929 
4930 
4931  // Obtener nº de dígitos de la cuenta contable, marca, familia, vendedor, etc. en el grupo, se utilizará en el ajuste de datos que se realiza una vez creadas las bases de datos del nuevo grupo.
4932  if (_Log)
4933  Guardar_Mensaje("Obteniendo nº de dígitos anchura de campos CUENTA, MARCA, FAMILIA, VENDEDOR, ALMACEN según base de datos de ejercicio origen."); // Bug 109147
4934 
4935  GrupoempTools._LenCuenta = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "cuentas", "cuenta contable", 8);
4936  GrupoempTools._LenMarca = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "marcas", "marca", 2);
4937  GrupoempTools._LenFamilia = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "familias", "familia", 2);
4938  GrupoempTools._LenVendedor = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "vendedor", "vendedor", 2);
4939  GrupoempTools._LenAlmacen = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "almacen", "almacén", 2); // Bug 109147
4940 
4941 
4942  // Detectando fechas de ejercicio origen.
4943  if (_Log)
4944  Guardar_Mensaje("Detectando ejercicio predeterminado en grupo origen.");
4945 
4946  DB.SQLExec("select * from " + DB.SQLDatabaseReal(_DbComunesGrOrigen, "ejercici") + " where [any]='"+tcEjerOrigen+"'", ref ldtAuxiliar);
4947  if (ldtAuxiliar.Rows.Count == 0)
4948  {
4949  _Error_Message = "No se ha detectado ejercicio origen en la tabla de ejercicios del grupo " + _GrupoOrigen;
4950  if (_Log)
4951  Guardar_Mensaje(_Error_Message);
4952  return false;
4953  }
4954  else
4955  {
4956  GrupoempTools._FechaIniEjerOrigen = Convert.ToDateTime(ldtAuxiliar.Rows[0]["periodoini"]);
4957  GrupoempTools._FechaFinEjerOrigen = Convert.ToDateTime(ldtAuxiliar.Rows[0]["periodofin"]);
4958  }
4959 
4960 
4961 
4962 
4963  // Averiguar prifijo de 3 dígitos con la que comienzan los clientes, proveedores, acreedores contables, bancos, cuentas compras, cuentas ventas.
4964  DB.SQLExec("select * from " + DB.SQLDatabaseReal(_DbComunesGrOrigen, "codcom"), ref ldtAuxiliar);
4965  if (ldtAuxiliar.Rows.Count > 0)
4966  {
4967  GrupoempTools._PrefijoCli3 = Convert.ToString(ldtAuxiliar.Rows[0]["cliente"]).Substring(0, 3);
4968  GrupoempTools._PrefijoPro3 = Convert.ToString(ldtAuxiliar.Rows[0]["proveed"]).Substring(0, 3);
4969  GrupoempTools._PrefijoAcr3 = Convert.ToString(ldtAuxiliar.Rows[0]["acreed"]).Substring(0, 3);
4970  GrupoempTools._PrefijoBan3 = Convert.ToString(ldtAuxiliar.Rows[0]["banco"]).Substring(0, 3);
4971  GrupoempTools._PrefijoCaj3 = Convert.ToString(ldtAuxiliar.Rows[0]["caja"]).Substring(0, 3);
4972  GrupoempTools._PrefijoCom3 = Convert.ToString(ldtAuxiliar.Rows[0]["compra"]).Substring(0, 3);
4973  GrupoempTools._PrefijoVen3 = Convert.ToString(ldtAuxiliar.Rows[0]["venta"]).Substring(0, 3);
4974  GrupoempTools._PrefijoDeudor3 = Convert.ToString(ldtAuxiliar.Rows[0]["deudor"]).Substring(0, 3);
4975 
4976  if (string.IsNullOrWhiteSpace(GrupoempTools._PrefijoCli3) || string.IsNullOrWhiteSpace(GrupoempTools._PrefijoPro3) ||
4977  string.IsNullOrWhiteSpace(GrupoempTools._PrefijoAcr3) || string.IsNullOrWhiteSpace(GrupoempTools._PrefijoBan3) ||
4978  string.IsNullOrWhiteSpace(GrupoempTools._PrefijoCom3) || string.IsNullOrWhiteSpace(GrupoempTools._PrefijoVen3) ||
4979  string.IsNullOrWhiteSpace(GrupoempTools._PrefijoCaj3) || string.IsNullOrWhiteSpace(GrupoempTools._PrefijoDeudor3))
4980  {
4981  _Error_Message = "No se ha podido detectar los prefijos de 3 dígitos para alguna de las cuentas contables de clientes, deudores, proveedores, acreedores, bancos, compras o ventas en el grupo origen " + _GrupoOrigen + ", alguno de ellos está vacío.";
4982  if (_Log)
4983  Guardar_Mensaje(_Error_Message);
4984  return false;
4985  }
4986  }
4987  else
4988  {
4989  _Error_Message = "No se ha podido detectar los prefijos de 3 dígitos para alguna de las cuentas contables de clientes, deudores, proveedores, acreedores, bancos, compras o ventas. No hay registros en COMUNES.CODCOM en el grupo origen " + _GrupoOrigen;
4990  if (_Log)
4991  Guardar_Mensaje(_Error_Message);
4992  return false;
4993  }
4994 
4995 
4996  // Detectamos con qué empresa trabajaremos, en condiciones normales será la '01' que será la que instala Sage50 de base, pero podrían haberla borrado en el grupo origen
4997  // y trabajar con otras, en este caso cogeremos la primera por orden.
4998  DB.SQLExec("select codigo, nombre, cif from " + DB.SQLDatabaseReal(_DbEjerGrOrigen, "empresa") + " where codigo='01'", ref ldtAuxiliar);
4999  if (ldtAuxiliar.Rows.Count == 1 && Convert.ToString(ldtAuxiliar.Rows[0]["codigo"]) == "01")
5000  GrupoempTools._EmpresaGrNuevo = "01";
5001  else
5002  {
5003  DB.SQLExec("select codigo,nombre,cif from " + DB.SQLDatabaseReal(_DbEjerGrOrigen, "empresa") + " order by codigo", ref ldtAuxiliar);
5004  if (ldtAuxiliar.Rows.Count == 0)
5005  {
5006  _Error_Message = "No se ha detectado ningún registro en la tabla EMPRESA de la base de datos de ejercicio " + _DbEjerGrOrigen + " del grupo origen " + _GrupoOrigen + ", no se creará el ejercicio.";
5007  if (_Log)
5008  Guardar_Mensaje(_Error_Message);
5009  return false;
5010  }
5011  else
5012  {
5013  GrupoempTools._EmpresaGrNuevo = Convert.ToString(ldtAuxiliar.Rows[0]["codigo"]);
5014  }
5015  }
5016  // Captamos ya el nombre de la empresa y el cif
5017  GrupoempTools._NombreEmpresa = Convert.ToString(ldtAuxiliar.Rows[0]["nombre"]);
5018  GrupoempTools._CifEmpresa = Convert.ToString(ldtAuxiliar.Rows[0]["cif"]);
5019 
5020 
5021  // Si no han declarado el usuario propietario de las nuevas bases de datos que se creen lo ponemos nosotros
5022  if (string.IsNullOrWhiteSpace(GrupoempTools._UserPropBdGrNuevo))
5023  GrupoempTools._UserPropBdGrNuevo = "Sage50";
5024 
5025 
5026  // Compruebo que todas las propiedades anteriores tengan valor, en teoria si se ha llegado hasta aquí todas ellas deberían estar informadas.
5027  string lcPropiedadNoInfo = "";
5028  if (string.IsNullOrWhiteSpace(_GrupoOrigen))
5029  lcPropiedadNoInfo += "_GrupoOrigen ";
5030  if (string.IsNullOrWhiteSpace(_DbComunesGrOrigen))
5031  lcPropiedadNoInfo += "_DbComunesGrOrigen ";
5032  if (string.IsNullOrWhiteSpace(_DbComunesGrNuevo))
5033  lcPropiedadNoInfo += "_DbComunesGrNuevo ";
5034  if (string.IsNullOrWhiteSpace(_DbEjerGrOrigen))
5035  lcPropiedadNoInfo += "_DbEjerGrOrigen ";
5036  if (string.IsNullOrWhiteSpace(_DbEjerGrNuevo))
5037  lcPropiedadNoInfo += "_DbEjerGrNuevo ";
5038  if (string.IsNullOrWhiteSpace(_CarpetaBackupServidorSql))
5039  lcPropiedadNoInfo += "_CarpetaBackupServidorSql ";
5040  if (string.IsNullOrWhiteSpace(_EmpresaGrNuevo))
5041  lcPropiedadNoInfo += "_EmpresaGrNuevo ";
5042  if (string.IsNullOrWhiteSpace(_SufiBdEjerGrNuevo))
5043  lcPropiedadNoInfo += "_SufiBdEjerGrNuevo ";
5044 
5045  if (!string.IsNullOrWhiteSpace(lcPropiedadNoInfo))
5046  {
5047  _Error_Message = "Al finalizar las comprobaciones previas a la creación del ejercicio se han detectado propiedades internas sin valor: " + lcPropiedadNoInfo;
5048  if (_Log)
5049  Guardar_Mensaje(_Error_Message);
5050  return false;
5051  }
5052 
5053  if (_DbComunesGrOrigen != _DbComunesGrNuevo)
5054  {
5055  _Error_Message = "Al finalizar las comprobaciones previas a la creación del ejercicio se ha detectado diferente valor para los nombres de la base de datos de COMUNES de grupo origen y destino que para la creación de un nuevo ejercicio deberían coincidir: " + _DbComunesGrOrigen + " " + _DbComunesGrNuevo;
5056  if (_Log)
5057  Guardar_Mensaje(_Error_Message);
5058  return false;
5059  }
5060 
5061 
5062  if (_DbEjerGrOrigen == _DbEjerGrNuevo)
5063  {
5064  _Error_Message = "Al finalizar las comprobaciones previas a la creación del ejercicio se ha detectado identico valor en los nombres de bases de datos de EJERCICIO del ejercicio origen y del ejercicio nuevo a crear: " + _DbEjerGrNuevo;
5065  if (_Log)
5066  Guardar_Mensaje(_Error_Message);
5067  return false;
5068  }
5069 
5070 
5071 
5072  // VERIFICAR EXISTENCIA DE LA TABLA TABSYS CON DATOS, EN COMUNES
5073  if (_Log)
5074  Guardar_Mensaje("Verificando la existencia de la tabla TABSYS en las bases de datos COMUNES y ADDOns del grupo origen.");
5075 
5076  bool llOK = GrupoempTools.CrearGrupo_Comprobar_TabSys("COMUNES", _DbComunesGrOrigen);
5077  if (!llOK)
5078  return false;
5079 
5080  if (_Log)
5081  Guardar_Mensaje("Existe la tabla TABSYS en la bases de datos COMUNES (" + _DbComunesGrOrigen.Trim()+ ") del grupo origen para la creación de nuevo ejercicio: OK.");
5082 
5083  if (_Log)
5084  {
5085  Guardar_Mensaje("Comprobaciones previas a la creación del ejercicio satisfactorias: OK."+Environment.NewLine);
5086  Guardar_Mensaje("FIN PROCESO COMPROBACIONES PREVIAS ANTES DE PROCEDER A LA CREACION DEL NUEVO EJERCICIO" + Environment.NewLine);
5087  }
5088 
5089  return true;
5090  }
5091 
5098  private static bool CrearGrupo_Comprobaciones_Previas(string tcGrupo, string tcGrOrigen)
5099  {
5100  string lcSql = "";
5101  DataTable ldtAuxiliar = new DataTable();
5102 
5103 
5104 
5105  if (_Log)
5106  Guardar_Mensaje("INICIO COMPROBACIONES PREVIAS"+Environment.NewLine);
5107 
5108  // Comprobamos que pasen bien el código de grupo a crear.
5109  // Se deberá obtener antes de llamar a este método, mediante llamada a otro método de la
5110  // DB: DB._GrupoEmpresa_Obtener_Codigo_Nuevo_Grupo()
5111  if (string.IsNullOrWhiteSpace(tcGrupo))
5112  {
5113  _Error_Message = "No se ha recibido el parámetro código de grupo a crear.";
5114  if (_Log)
5115  Guardar_Mensaje(_Error_Message);
5116  return false;
5117  }
5118 
5119 
5120 
5121  // Si no existe la tabla acabo, esto no debería ocurrir en ningún caso pues si no existe se crea cuando se conecta, pero se comprueba para evitar la petada si fuera el caso.
5122  if (DB._SQLExisteTablaBBDD("EUROWINSYS", "GRUPOSEMP") == false)
5123  {
5124  _Error_Message = "No se ha detectado la tabla eurowinsys.gruposemp, no se creará el grupo " + tcGrupo;
5125  if (_Log)
5126  Guardar_Mensaje(_Error_Message);
5127  return false;
5128  }
5129  if (_Log)
5130  Guardar_Mensaje("Existe la tabla GruposEmp: OK.");
5131 
5132 
5133 
5134 
5135  // ESTO DE MOMENTO NO LO CONTROLO POR QUE AL CREAR UN GRUPO POR FORMULARIO COMIENZA GUARDANDOLO SIEMPRE Y ES AL HACER CANCELAR QUE LO BORRA, SEGUN ESTO, ESTA COMPROBACION QUE SIGUE
5136  // DARA SIEMPRE POSITIVO POR QUE EXISTIRA SIEMPRE EL CODIGO Y NO DEJARIA CREAR NINGUN GRUPO. DE MOMENTO COMENTO.
5137 
5138  DataTable ldtGrupos = new DataTable();
5139  //lcSql = "SELECT * FROM [EUROWINSYS].[dbo].[gruposemp] where codigo=" + DB.SQLString(tcGrupo);
5140  //DB.SQLExec(lcSql, ref ldtGrupos);
5141  //if (ldtGrupos.Rows.Count == 1)
5142  //{
5143  // _Error_Message = "Se ha detectado la existencia ya del grupo " + tcGrupo + " en la tabla eurowinsys.gruposemp, no se creará el grupo " + tcGrupo;
5144  // if (_Log)
5145  // Guardar_Mensaje(_Error_Message);
5146  // return false;
5147  //}
5148  //if (_Log)
5149  // Guardar_Mensaje("El grupo a crear "+tcGrupo+" no existe en EurowinSys.GruposEmp: OK.");
5150 
5151  // Miramos si tenemos el grupo origen definido en la tabla EUROWINSYS!GRUPOSEMP pues será el origen de la
5152  // creación del nuevo grupo, es necesario que exista.
5153 
5154  // Grupo al que estamos conectados en el instante de la creación del nuevo grupo
5155  string lcCodGrupoActual = DB.DbComunes.Trim().Substring(4, 4);
5156  if (_Log)
5157  Guardar_Mensaje("Conexión origen: grupo "+lcCodGrupoActual+" con base de datos de COMUNES ("+DB.DbComunes+")");
5158 
5159  // Obtengo el grupo origen correspondiente al grupo en que estoy.
5160  string lcCodGrupoPripal = GrupoempTools._Obtener_CodGrupoPripal(lcCodGrupoActual);
5161 
5162  ldtGrupos.Clear();
5163  lcSql = "SELECT * FROM [EUROWINSYS].[dbo].[gruposemp] where codigo=" + DB.SQLString(lcCodGrupoPripal) + " and pripal=" + DB.SQLTrue();
5164  DB.SQLExec(lcSql, ref ldtGrupos);
5165  if (ldtGrupos.Rows.Count != 1)
5166  {
5167  _Error_Message = "No se ha detectado el grupo principal de la instalación en la tabla eurowinsys.gruposemp para el grupo activo " + lcCodGrupoActual + ", no se creará el grupo " + tcGrupo;
5168  if (_Log)
5169  Guardar_Mensaje(_Error_Message);
5170  return false;
5171  }
5172  if (_Log)
5173  Guardar_Mensaje("Grupo principal asociado al grupo actual: " + Convert.ToString((ldtGrupos.Rows[0]["codigo"])) );
5174  GrupoempTools._GrupoPrincipal = Convert.ToString(ldtGrupos.Rows[0]["codigo"]);
5175 
5176 
5177  // Determino el grupo origen de la creación de nuevo grupo, si me passan por parámetro lo utilizo, sino utilizo el grupo principal
5178  if (!string.IsNullOrWhiteSpace(tcGrOrigen))
5179  {
5180  ldtGrupos.Clear();
5181  lcSql = "SELECT * FROM [EUROWINSYS].[dbo].[gruposemp] where codigo=" + DB.SQLString(tcGrOrigen);
5182  DB.SQLExec(lcSql, ref ldtGrupos);
5183  if (ldtGrupos.Rows.Count != 1)
5184  {
5185  _Error_Message = "No se ha detectado el grupo origen " + tcGrOrigen + " en la tabla de grupos, no se creará el grupo " + tcGrupo;
5186  if (_Log)
5187  Guardar_Mensaje(_Error_Message);
5188  return false;
5189  }
5190  if (_Log)
5191  Guardar_Mensaje("Grupo origen de la creación de grupo: " + tcGrOrigen);
5192 
5193  GrupoempTools._GrupoOrigen = tcGrOrigen;
5194  }
5195  else
5196  GrupoempTools._GrupoOrigen = _GrupoPrincipal;
5197 
5198  if (_Log)
5199  {
5200  Guardar_Mensaje("Grupo origen que se utilizará para la creación del nuevo grupo: " + GrupoempTools._GrupoOrigen);
5201  Guardar_Mensaje("Grupo a crear: " + tcGrupo);
5202  }
5203 
5204  // Miramos que exista la base de datos de COMUNES del grupo origen
5205  GrupoempTools._DbComunesGrOrigen = "COMU" + _GrupoOrigen.Trim();
5206  if (!DB._SQLExisteBBDD(_DbComunesGrOrigen))
5207  {
5208  _Error_Message = "No se ha detectado en el servidor SQL la base de datos de COMUNES (" + _DbComunesGrOrigen + ") asociada al grupo (" + _GrupoOrigen + ") " +
5209  "que se pretende utilizar para la creación del nuevo grupo, no se creará el grupo " + tcGrupo;
5210  if (_Log)
5211  Guardar_Mensaje(_Error_Message);
5212  return false;
5213  }
5214  if (_Log)
5215  {
5216  Guardar_Mensaje("Base de datos de COMUNES del grupo origen: " + _DbComunesGrOrigen);
5217  Guardar_Mensaje("Base de datos de COMUNES del grupo origen existe en el servidor SQL.");
5218  }
5219 
5220 
5221 
5222  // La base de datos de COMUNES del nuevo grupo a crear no debería existir en el servidor SQL
5223  GrupoempTools._DbComunesGrNuevo = "COMU" + tcGrupo.Trim();
5224  if (DB._SQLExisteBBDD(GrupoempTools._DbComunesGrNuevo))
5225  {
5226  _Error_Message = "La base de datos " + _DbComunesGrNuevo + " correspondiente al nuevo grupo a crear (" + tcGrupo + ") ya existe en el servidor. Imposible crear grupo.";
5227  if (_Log)
5228  Guardar_Mensaje(_Error_Message);
5229  return false;
5230  }
5231  if (_Log)
5232  {
5233  Guardar_Mensaje("Base de datos de COMUNES del grupo a crear " + tcGrupo + ": " + GrupoempTools._DbComunesGrNuevo);
5234  Guardar_Mensaje("Base de datos de COMUNES del grupo a crear no existe en el servidor SQL.");
5235  }
5236 
5237 
5238  if (_Log)
5239  Guardar_Mensaje("Obteniendo los Add-ons base");
5240  GrupoempTools.ObtenerAddonsBase(); //Bug 131839
5241 
5242 
5243  // Buscamos las bd. de los Add-ons del grupo origen que reseguiremos después.
5244  if (_Log)
5245  Guardar_Mensaje("Obteniendo bases de datos de Add-ons de grupo origen " + GrupoempTools._GrupoOrigen + " (COMU" + _GrupoOrigen + ")");
5246 
5247  DB.SQLExec("select nom_conex,nombre from " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrOrigen, "modulos"), ref _dtBdAddonsGrOrigen);
5248  if (_Log)
5249  {
5250  Guardar_Mensaje("Detectados " + _dtBdAddonsGrOrigen.Rows.Count.ToString() + " Add-ons.");
5251  foreach (DataRow loRow in _dtBdAddonsGrOrigen.Rows)
5252  Guardar_Mensaje(Convert.ToString(loRow["nom_conex"]));
5253  }
5254 
5255  // Buscamos la bd del ejercicio PREDET y las guardamos en un DataTable.
5256  GrupoempTools._DbEjerGrOrigen = "";
5257  if (_Log)
5258  Guardar_Mensaje("Obteniendo base de datos de ejercicio predeterminado de " + _DbComunesGrOrigen);
5259  DB.SQLExec("select * from " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrOrigen, "ejercici") + " where predet=" + DB.SQLTrue(), ref ldtAuxiliar);
5260  if (ldtAuxiliar.Rows.Count == 1)
5261  {
5262  GrupoempTools._DbEjerGrOrigen = Convert.ToString(ldtAuxiliar.Rows[0]["conexion"]).Trim();
5263  GrupoempTools._EjerOrigen = Convert.ToString(ldtAuxiliar.Rows[0]["any"]).Trim();
5264  GrupoempTools._FechaIniEjerOrigen = Convert.ToDateTime(ldtAuxiliar.Rows[0]["periodoini"]);
5265  GrupoempTools._FechaFinEjerOrigen = Convert.ToDateTime(ldtAuxiliar.Rows[0]["periodofin"]);
5266  if (_Log)
5267  {
5268  Guardar_Mensaje("Base de datos de EJERCICIO predeterminado de grupo origen: " + GrupoempTools._DbEjerGrOrigen);
5269  Guardar_Mensaje("Ejercicio predeterminado en grupo origen: " + GrupoempTools._EjerOrigen);
5270  }
5271  }
5272  else
5273  {
5274  _Error_Message = "No se ha detectado la base de datos de ejercicio predeterminado en el grupo origen " + GrupoempTools._GrupoOrigen + ", imposible crear grupo " + tcGrupo;
5275  if (_Log)
5276  Guardar_Mensaje(_Error_Message);
5277  return false;
5278  }
5279 
5280  // La base de datos de EJERCICIO del grupo origen debería existir en el servidor SQL
5281  if (!DB._SQLExisteBBDD(GrupoempTools._DbEjerGrOrigen))
5282  {
5283  _Error_Message = "La base de datos de EJERCICIO " + GrupoempTools._DbEjerGrOrigen + " correspondiente al nuevo grupo a crear (" + tcGrupo + ") no existe en el servidor, imposible crear grupo.";
5284  if (_Log)
5285  Guardar_Mensaje(_Error_Message);
5286  return false;
5287  }
5288  if (_Log)
5289  Guardar_Mensaje("La base de datos de ejercicio predeterminado del grupo origen " + GrupoempTools._GrupoOrigen + " " + GrupoempTools._DbEjerGrOrigen + " existe en el servidor SQL: OK");
5290 
5291 
5292  // Obtener base de datos de ejercicio para el nuevo grupo a crear y su sufijo.
5293  // Iterar hasta que no exista ninguna de las bases de datos que se crearan para el nuevo grupo con el sufijo (ejercicio y addons). Si detecta que alguna
5294  // de ellas ya existe, obtendrá otro sufijo y volvera a verificar hasta que ninguna de las bds. existan.
5295  bool llExisteAlgunaBdNew = false;
5296 
5297  DataTable ldtBdsExcluir = new DataTable();
5298  ldtBdsExcluir.Columns.Add(new DataColumn("name", typeof(string)));
5299 
5300  do
5301  {
5302  // En ldtBdsExcluir (inicialmente vacio al comenzar a iterar) iremos acumulando cualquier bd de gestion que aunque no exista (lo cual la haría candidata
5303  // a poder ser utilizada), no pueda ser utilizada por existir algun addon con el mismo sufijo u otro ejercicio
5304  // con el mismo sufijo.
5305  //
5306  GrupoempTools._DbEjerGrNuevo = DB._Obtener_NuevaDb_Gestion(_EjerNuevo, 6, ldtBdsExcluir);
5307  if (string.IsNullOrWhiteSpace(GrupoempTools._DbEjerGrNuevo))
5308  {
5309  _Error_Message = "No se ha podido obtener el nombre de la base de datos de ejercicio a crear para el nuevo grupo, imposible crear grupo " + tcGrupo;
5310  if (_Log)
5311  Guardar_Mensaje(_Error_Message);
5312  return false;
5313  }
5314  if (_Log)
5315  Guardar_Mensaje("Asignado nombre a base de datos de EJERCICIO de nuevo grupo: " + GrupoempTools._DbEjerGrNuevo);
5316 
5317  GrupoempTools._SufiBdEjerGrNuevo = GrupoempTools._DbEjerGrNuevo.Substring(4, 2);
5318 
5319  // Si el sufijo no está bien, paro.
5320  if (GrupoempTools._SufiBdEjerGrNuevo.Trim().Length != 2)
5321  {
5322  _Error_Message = "El sufijo del nombre de la base de datos de EJERCICIO origen " + _DbEjerGrOrigen + " no tiene el formato correcto, debería tener 2 carácteres: " + GrupoempTools._SufiBdEjerGrNuevo;
5323  if (_Log)
5324  Guardar_Mensaje(_Error_Message);
5325  return false;
5326  }
5327  else
5328  {
5329  if (_Log)
5330  Guardar_Mensaje("Sufijo para las bases de datos del nuevo grupo: " + GrupoempTools._SufiBdEjerGrNuevo);
5331  }
5332 
5333  // Si existe alguna posible base de datos de addon a crear ya existente con el mismo sufijo o alguna bd de ejercicio, anterio
5334  // o posterior, al que se pretende crear, con el mismo sufijo, pasaremos de este sufijo y iremos a obtener otro nuevo
5335  //
5336  llExisteAlgunaBdNew = GrupoempTools.CrearGrupo_Comprobar_Existencia_BdNuevas(GrupoempTools._EjerNuevo, GrupoempTools._SufiBdEjerGrNuevo);
5337  if (llExisteAlgunaBdNew)
5338  {
5339  if (_Log)
5340  Guardar_Mensaje("Alguna de las nuevas bases de datos a crear en el nuevo grupo con el sufijo " + _SufiBdEjerGrNuevo+" ya existe, se reintenta la generación de nombres de bds. con nuevo sufijo.");
5341 
5342  // En ldtBdsExcluir iremos acumulando cualquier bd de gestion que aunque no exista (lo cual la haría candidata
5343  // a poder ser utilizada), no pueda ser utilizada por existir algun addon con el mismo sufijo u otro ejercicio
5344  // con el mismo sufijo.
5345  //
5346 
5347  DataRow loRow = ldtBdsExcluir.NewRow();
5348  loRow["name"] = GrupoempTools._DbEjerGrNuevo.Trim();
5349  ldtBdsExcluir.Rows.Add(loRow);
5350  }
5351  }
5352  while (llExisteAlgunaBdNew);
5353 
5354 
5355  // La base de datos de EJERCICIO del nuevo grupo a crear no debería existir en el servidor SQL
5356  if (DB._SQLExisteBBDD(GrupoempTools._DbEjerGrNuevo))
5357  {
5358  _Error_Message = "La base de datos " + _DbEjerGrNuevo + " correspondiente al ejercicio del nuevo grupo a crear (" + tcGrupo + ") ya existe en el servidor, imposible crear grupo.";
5359  if (_Log)
5360  Guardar_Mensaje(_Error_Message);
5361  return false;
5362  }
5363  if (_Log)
5364  Guardar_Mensaje("La base de datos de EJERCICIO " + GrupoempTools._DbEjerGrNuevo + " que se creará para el nuevo grupo no existe en el servidor SQL: OK");
5365 
5366 
5367 
5368 
5369  // En el nuevo grupo solo se ponen los ADDONS que se instalan inicialmente en Sage50: TPV, LOTES, AMORTIZA, MAYORIST, INFORAUT, por tanto
5370  // eliminaremos del DataTable ldtBdModulosGrOrigen los Add-ons que no estan entre estos (SERVEIS, FIDELIZA, EDI_DOC) pues no se crearan en el nuevo grupo
5371  bool llHayCambios = false;
5372  string lcNombreAddon = "";
5373  for (int i = GrupoempTools._dtBdAddonsGrOrigen.Rows.Count - 1; i >= 0; i--)
5374  {
5375  lcNombreAddon = Convert.ToString(GrupoempTools._dtBdAddonsGrOrigen.Rows[i]["nombre"]).Trim().ToUpper();
5376  if (!GrupoempTools._AddonsInstal.Contains(lcNombreAddon))
5377  {
5378  llHayCambios = true;
5379  DataRow dr = GrupoempTools._dtBdAddonsGrOrigen.Rows[i];
5380  dr.Delete();
5381  }
5382  }
5383  if (llHayCambios)
5384  GrupoempTools._dtBdAddonsGrOrigen.AcceptChanges();
5385 
5386 
5387  // Las base de datos de los ADDONS que se crearan en el nuevo grupo tampoco deberían existir.
5388  string lcNewBdAddon = "";
5389 
5390  // Clonamos ya el DataTable de Addons del grupo origen para averiguar las bases de datos de Addons que tendran en el nuevo grupo.
5391  GrupoempTools._dtBdAddonsGrNuevo = GrupoempTools._dtBdAddonsGrOrigen.Clone();
5392  GrupoempTools._dtBdAddonsGrNuevo.Clear();
5393 
5394 
5395  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrOrigen.Rows)
5396  {
5397  lcNewBdAddon = Convert.ToString(loRow["nom_conex"]).Trim();
5398  lcNewBdAddon = lcNewBdAddon.Substring(0, lcNewBdAddon.Length - 2);
5399  lcNewBdAddon = lcNewBdAddon + GrupoempTools._SufiBdEjerGrNuevo;
5400 
5401  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim().ToUpper();
5402 
5403  // La base de datos de los Addons nuevos a crear no deberían existir en el servidor SQL
5404  if (DB._SQLExisteBBDD(lcNewBdAddon))
5405  {
5406  _Error_Message = "La base de datos " + lcNewBdAddon + " correspondiente al nuevo grupo a crear (" + tcGrupo + ") ya existe en el servidor, imposible crear grupo.";
5407  if (_Log)
5408  Guardar_Mensaje(_Error_Message);
5409  return false;
5410  }
5411  else
5412  {
5413  // Agrego la nueva bd del Addons al DataTable
5414  DataRow loRow2 = GrupoempTools._dtBdAddonsGrNuevo.NewRow();
5415  loRow2["nombre"] = loRow["nombre"];
5416  loRow2["nom_conex"] = lcNewBdAddon;
5417  GrupoempTools._dtBdAddonsGrNuevo.Rows.Add(loRow2);
5418 
5419  if (_Log)
5420  Guardar_Mensaje("La base de datos del Add-On " + lcNombreAddon + " " + lcNewBdAddon + " correspondiente al nuevo grupo a crear (" + tcGrupo + ") no existe en el servidor: OK");
5421  }
5422  }
5423 
5424 
5425  // tcCarpetaBackupServidorSql = lcCarpetaDataServidorSql.ToLower().Replace("\\data", "\\backup");
5426  GrupoempTools._CarpetaBackupServidorSql = DB._SQLRutaBackup();
5427  if (string.IsNullOrWhiteSpace(_CarpetaBackupServidorSql))
5428  {
5429  _Error_Message = "No se ha podido averiguar la carpeta de Backup del servidor SQL.";
5430  if (_Log)
5431  Guardar_Mensaje(_Error_Message);
5432  return false;
5433  }
5434 
5435  if (_Log)
5436  Guardar_Mensaje("Obtenida ruta de Backup en el servidor SQL " + _CarpetaBackupServidorSql + ": OK");
5437 
5438 
5439 
5440 
5441  // Obtener nº de dígitos de la cuenta contable, marca, familia, vendedor, etc., en el grupo origen, se utilizará en el ajuste de datos que se realiza una vez creadas las bases de datos del nuevo grupo
5442  if (_Log)
5443  Guardar_Mensaje("Obteniendo nº de dígitos anchura de campos CUENTA, MARCA, FAMILIA, VENDEDOR según base de datos de ejercicio en grupo origen.");
5444 
5445  // Si no creamos el grupo con las longitudes estándar, entonces cogemos las longitudes del grupo origen
5446  if (!GrupoempTools._LongitudesEstandar)
5447  {
5448  GrupoempTools._LenCuenta = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "cuentas", "cuenta contable", 8);
5449  GrupoempTools._LenMarca = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "marcas", "marca", 2);
5450  GrupoempTools._LenFamilia = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "familias", "familia", 2);
5451  GrupoempTools._LenVendedor = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "vendedor", "vendedor", 2);
5452  GrupoempTools._LenAlmacen = GrupoempTools.CrearGrupo_Obtener_LenCampo(_DbEjerGrOrigen, "almacen", "almacén", 2); // Bug 109147
5453  }
5454  else
5455  {
5456  // Crear el grupo con las longitudes estándar, definimos las longitudes estándar
5457  GrupoempTools._LenCuenta = 8;
5458  GrupoempTools._LenMarca = 2;
5459  GrupoempTools._LenFamilia = 2;
5460  GrupoempTools._LenVendedor = 2;
5461  GrupoempTools._LenAlmacen = 2; // Bug 109147
5462  }
5463 
5464  // Averiguar prefijo de 3 dígitos con la que comienzan los clientes, proveedores y acreedores contables.
5465  DB.SQLExec("select * from " + DB.SQLDatabaseReal(_DbComunesGrOrigen, "codcom"), ref ldtAuxiliar);
5466  if (ldtAuxiliar.Rows.Count > 0)
5467  {
5468  GrupoempTools._PrefijoCli3 = Convert.ToString(ldtAuxiliar.Rows[0]["cliente"]).Substring(0, 3);
5469  GrupoempTools._PrefijoPro3 = Convert.ToString(ldtAuxiliar.Rows[0]["proveed"]).Substring(0, 3);
5470  GrupoempTools._PrefijoAcr3 = Convert.ToString(ldtAuxiliar.Rows[0]["acreed"]).Substring(0, 3);
5471  GrupoempTools._PrefijoBan3 = Convert.ToString(ldtAuxiliar.Rows[0]["banco"]).Substring(0, 3);
5472  GrupoempTools._PrefijoCaj3 = Convert.ToString(ldtAuxiliar.Rows[0]["caja"]).Substring(0, 3);
5473  GrupoempTools._PrefijoCom3 = Convert.ToString(ldtAuxiliar.Rows[0]["compra"]).Substring(0, 3);
5474  GrupoempTools._PrefijoVen3 = Convert.ToString(ldtAuxiliar.Rows[0]["venta"]).Substring(0, 3);
5475  GrupoempTools._PrefijoDeudor3 = Convert.ToString(ldtAuxiliar.Rows[0]["deudor"]).Substring(0, 3);
5476 
5477  if (string.IsNullOrWhiteSpace(GrupoempTools._PrefijoCli3) || string.IsNullOrWhiteSpace(GrupoempTools._PrefijoPro3) ||
5478  string.IsNullOrWhiteSpace(GrupoempTools._PrefijoAcr3) || string.IsNullOrWhiteSpace(GrupoempTools._PrefijoBan3) ||
5479  string.IsNullOrWhiteSpace(GrupoempTools._PrefijoCom3) || string.IsNullOrWhiteSpace(GrupoempTools._PrefijoVen3) ||
5480  string.IsNullOrWhiteSpace(GrupoempTools._PrefijoCaj3) || string.IsNullOrWhiteSpace(GrupoempTools._PrefijoDeudor3) )
5481  {
5482  _Error_Message = "No se ha podido detectar los prefijos de 3 dígitos para alguna de las cuentas contables de clientes, deudores, proveedores, acreedores, bancos, compras o ventas en el grupo origen " + _GrupoOrigen+", alguno de ellos está vacío.";
5483  if (_Log)
5484  Guardar_Mensaje(_Error_Message);
5485  return false;
5486  }
5487  }
5488  else
5489  {
5490  _Error_Message = "No se ha podido detectar los prefijos de 3 dígitos para alguna de las cuentas contables de clientes, deudores, proveedores, acreedores, bancos, compras o ventas. No hay registros en COMUNES.CODCOM en el grupo origen " + _GrupoOrigen;
5491  if (_Log)
5492  Guardar_Mensaje(_Error_Message);
5493  return false;
5494  }
5495 
5496 
5497  // Detectamos con qué empresa trabajaremos, en condiciones normales será la '01' que será la que instala Sage50 de base, pero podrían haberla borrado en el grupo origen
5498  // y trabajar con otras, en este caso cogeremos la primera por orden.
5499  DB.SQLExec("select codigo from " + DB.SQLDatabaseReal(_DbEjerGrOrigen, "empresa") + " where codigo='01'", ref ldtAuxiliar);
5500  if (ldtAuxiliar.Rows.Count == 1 && Convert.ToString(ldtAuxiliar.Rows[0]["codigo"]) == "01")
5501  GrupoempTools._EmpresaGrNuevo = "01";
5502  else
5503  {
5504  DB.SQLExec("select codigo from " + DB.SQLDatabaseReal(_DbEjerGrOrigen, "empresa") + " order by codigo", ref ldtAuxiliar);
5505  if (ldtAuxiliar.Rows.Count == 0)
5506  {
5507  _Error_Message = "No se ha detectado ningún registro en la tabla EMPRESA de la base de datos de ejercicio "+_DbEjerGrOrigen+" del grupo origen " + _GrupoOrigen+", no se creará el grupo.";
5508  if (_Log)
5509  Guardar_Mensaje(_Error_Message);
5510  return false;
5511  }
5512  else
5513  {
5514  GrupoempTools._EmpresaGrNuevo = Convert.ToString(ldtAuxiliar.Rows[0]["codigo"]);
5515  }
5516  }
5517 
5518 
5519  // Compruebo que todas las propiedades anteriores tengan valor, en teoria si se ha llegado hasta aquí todas ellas deberían estar informadas.
5520  string lcPropiedadNoInfo = "";
5521  if (string.IsNullOrWhiteSpace(_GrupoPrincipal))
5522  lcPropiedadNoInfo += "_GrupoPrincipal ";
5523  if (string.IsNullOrWhiteSpace(_GrupoOrigen))
5524  lcPropiedadNoInfo += "_GrupoOrigen ";
5525  if (string.IsNullOrWhiteSpace(_DbComunesGrOrigen))
5526  lcPropiedadNoInfo += "_DbComunesGrOrigen ";
5527  if (string.IsNullOrWhiteSpace(_DbEjerGrOrigen))
5528  lcPropiedadNoInfo += "_DbEjerGrOrigen ";
5529  if (string.IsNullOrWhiteSpace(_DbComunesGrNuevo))
5530  lcPropiedadNoInfo += "_DbComunesGrNuevo ";
5531  if (string.IsNullOrWhiteSpace(_DbEjerGrNuevo))
5532  lcPropiedadNoInfo += "_DbEjerGrNuevo ";
5533  if (string.IsNullOrWhiteSpace(_CarpetaBackupServidorSql))
5534  lcPropiedadNoInfo += "_CarpetaBackupServidorSql ";
5535  if (string.IsNullOrWhiteSpace(_EmpresaGrNuevo))
5536  lcPropiedadNoInfo += "_EmpresaGrNuevo ";
5537  if (string.IsNullOrWhiteSpace(_SufiBdEjerGrNuevo))
5538  lcPropiedadNoInfo += "_SufiBdEjerGrNuevo ";
5539  if (string.IsNullOrWhiteSpace(_EjerOrigen))
5540  lcPropiedadNoInfo += "_EjerOrigen ";
5541  if (_FechaIniEjerOrigen == null)
5542  lcPropiedadNoInfo += "_FechaIniEjerOrigen ";
5543  if (_FechaFinEjerOrigen == null)
5544  lcPropiedadNoInfo += "_FechaFinEjerOrigen ";
5545 
5546 
5547  if (!string.IsNullOrWhiteSpace(lcPropiedadNoInfo))
5548  {
5549  _Error_Message = "Al finalizar las comprobaciones previas a la creación del grupo se han detectado propiedades internas sin valor: "+lcPropiedadNoInfo;
5550  if (_Log)
5551  Guardar_Mensaje(_Error_Message);
5552  return false;
5553  }
5554 
5555  if (_DbComunesGrOrigen == _DbComunesGrNuevo)
5556  {
5557  _Error_Message = "Al finalizar las comprobaciones previas a la creación del nuevo grupo se han detectado identico valor en los nombres de bases de datos de COMUNES del grupo origen y del grupo nuevo a crear: "+_DbComunesGrOrigen;
5558  if (_Log)
5559  Guardar_Mensaje(_Error_Message);
5560  return false;
5561  }
5562 
5563  if ( _DbEjerGrOrigen == _DbEjerGrNuevo)
5564  {
5565  _Error_Message = "Al finalizar las comprobaciones previas a la creación del nuevo grupo se han detectado identico valor en los nombres de bases de datos de EJERCICIO del grupo origen y del grupo nuevo a crear: "+_DbEjerGrOrigen;
5566  if (_Log)
5567  Guardar_Mensaje(_Error_Message);
5568  return false;
5569  }
5570 
5571 
5572 
5573  // VERIFICAR EXISTENCIA DE LA TABLA TABSYS CON DATOS, EN COMUNES Y EN LOS ADDONS DEL grupo origen
5574  if (_Log)
5575  Guardar_Mensaje("Verificando la existencia de la tabla TABSYS en las bases de datos COMUNES y ADDOns del grupo origen.");
5576 
5577  bool llOK = GrupoempTools.CrearGrupo_Comprobar_TabSys("COMUNES",_DbComunesGrOrigen);
5578  if (!llOK)
5579  return false;
5580 
5581  if (_Log)
5582  Guardar_Mensaje("Existe la tabla TABSYS en todas las bases de datos COMUNES y ADDONS del grupo origen: OK.");
5583 
5584  string lcBdAddon="";
5585  foreach (DataRow loRow in _dtBdAddonsGrOrigen.Rows)
5586  {
5587  lcNombreAddon = Convert.ToString(loRow["nombre"]).Trim();
5588  lcBdAddon = Convert.ToString(loRow["nom_conex"]).Trim().ToUpper();
5589  llOK = GrupoempTools.CrearGrupo_Comprobar_TabSys("ADDON", lcBdAddon, lcNombreAddon);
5590  if (!llOK)
5591  return false;
5592  }
5593 
5594 
5595  if (_Log)
5596  {
5597  Guardar_Mensaje("Comprobaciones previas a la creación del grupo satisfactorias: OK."+Environment.NewLine);
5598  Guardar_Mensaje("FIN COMPROBACIONES PREVIAS"+Environment.NewLine);
5599  }
5600 
5601  return true;
5602  }
5603 
5610  private static bool Backup_Bd(string tcDb, string tcMensajeLog = "")
5611  {
5612  bool llOk = false;
5613 
5614  if (GrupoempTools._Log)
5615  Guardar_Mensaje("Realizando copia base de datos " + tcDb);
5616 
5617  llOk = DB._DbBackup(tcDb, GrupoempTools._CarpetaBackupServidorSql);
5618 
5619 
5620  if (llOk)
5621  {
5622  if (GrupoempTools._Log)
5623  Guardar_Mensaje("La copia de seguridad de la base de datos de " + tcMensajeLog + " " + tcDb + " se ha realizado correctamente: OK");
5624  }
5625  else
5626  {
5627  _Error_Message = "La copia de seguridad de la base de datos de " + tcMensajeLog + " " + tcDb + " NO se ha realizado correctamente.";
5628  if (GrupoempTools._Log)
5629  Guardar_Mensaje(_Error_Message);
5630  return false;
5631  }
5632 
5633  return true;
5634  }
5635 
5636 
5644  private static bool Restore_Bd(string tcDbNombreViejo, string tcDbNombreNuevo, string tcMensalog = "")
5645  {
5646  bool llOk = false;
5647 
5648  if (_Log)
5649  Guardar_Mensaje("Realizando restauración de la copia de la base de datos de " + tcMensalog + " del grupo origen " + tcDbNombreViejo + " con nuevo nombre " + tcDbNombreNuevo);
5650  DB.Error_Message = "";
5651  llOk = DB._DbRestore(tcDbNombreViejo, tcDbNombreNuevo, GrupoempTools._CarpetaBackupServidorSql, GrupoempTools._UserPropBdGrNuevo);
5652  if (llOk)
5653  {
5654  if (_Log)
5655  Guardar_Mensaje("La creación de la nueva base de datos de " + tcMensalog + " " + tcDbNombreNuevo + " se ha realizado correctamente: OK");
5656  }
5657  else
5658  {
5659  // CCR 191787
5660  // Si no funcionó el RESTORE probablemente sea debido al problema de que no ha poddio cambiar el usuario a la
5661  // base de datos por estar todo con usuario Eurowin y debido a que el DTS no pudo hacer el cambio a usuario Sage50
5662  // al pasar el DTS.
5663  //
5664  // Miramos si tenemos contraseña de sa (solo la tendremos si la creación del grupo fue en visual, se pide si no se
5665  // puede detectar automáticamente, si la creación del grupo fue desde DTS no se pide y estará vacia)
5666  //
5667  // Si no tenemos contraseña de sa acabamos devolviendo false.
5668  // Si tenemos contraseña de sa intentaremos conectar con usuario sa y volver a intentar el RESTORE
5669  //
5670  if (string.IsNullOrWhiteSpace(GrupoempTools._CrearGrupoP))
5671  {
5672  _Error_Message = "NO se ha podido restaurar la copia de seguridad de la base de datos de " + tcMensalog + " " + tcDbNombreViejo + " como " + tcDbNombreNuevo + ", imposible crear grupo. Error: " + DB.Error_Message;
5673  if (_Log)
5674  Guardar_Mensaje(_Error_Message);
5675  return false;
5676  }
5677 
5678  // Si se ha producido un error, borrar la base de datos si existe, pues si el error fue al cambiar el usuario de la bd
5679  // la bd. estará ya creada, y si a continuación se vuelve a intentar el RESTORE con usuario sa la bd no debería
5680  // existir, sino no podrá hacer el RESTORE tampoco.
5681  //
5682  borrarBaseDatos(tcDbNombreNuevo);
5683 
5684  if (_Log)
5685  {
5686  Guardar_Mensaje("NO se ha podido restaurar la copia de seguridad de la base de datos de " + tcMensalog + " " + tcDbNombreViejo + " como " + tcDbNombreNuevo + ". Error: " + DB.Error_Message);
5687  Guardar_Mensaje("Intentando restaurar la base de datos con el usuario 'sa'");
5688  }
5689 
5690  // Vamos a intentar restaurar la base de datos conectando primero con sa
5691  //
5692 
5693  //Obtener usuario y contraseña actual de la conexión
5694  string lcUsuarioActual = string.Empty;
5695  string lcPassActual = string.Empty;
5696  datosConexionActual(out lcUsuarioActual, out lcPassActual);
5697 
5698  // Conectar con el usuario "sa" y restaurar base de datos
5699  string lcMsgError = string.Empty;
5700  llOk = restoreUsuario(tcDbNombreViejo, tcDbNombreNuevo, lcUsuarioActual, out lcMsgError, tcMensalog);
5701 
5702  //Restauramos la conexión del usuario anterior
5703  conectarUsuario(lcUsuarioActual, lcPassActual);
5704 
5705  if (!llOk)
5706  {
5707  _Error_Message = lcMsgError;
5708  if (_Log)
5709  Guardar_Mensaje(_Error_Message);
5710 
5711  return false;
5712  }
5713  }
5714 
5715 
5716  return llOk;
5717  }
5718 
5725  private static bool Restore_Indices_ValoresDefecto(string tcDbNombreViejo, string tcDbNombreNuevo)
5726  {
5727  // Solamente lo utilizamos cuando creamos un grupo con copia y restauración
5728  if (GrupoempTools._TipoOperativaCreacionGrupoEjer != GrupoempTools.TipoOperativaCreacion.PorCopiaRestauracionBd)
5729  return true;
5730 
5731  if (_Log)
5732  Guardar_Mensaje("Revisando índices y valores por defecto de la base de datos " + tcDbNombreNuevo);
5733 
5734  // Obtener en un DataTable los valores por defecto de las tablas de la base de datos origen
5735  DataTable ldtIndices = new DataTable();
5736  if (ObtenerIndicesDb(tcDbNombreNuevo, ref ldtIndices))
5737  {
5738  // Actualizar los indices de la base de datos
5739  if (!CrearGrupoEjer_Actualizar_Indices(tcDbNombreViejo, tcDbNombreNuevo, "", ldtIndices))
5740  return false;
5741  }
5742 
5743  // Obtener en un DataTable los valores por defecto de las tablas de la base de datos origen
5744  DataTable ldtValsDefecto = new DataTable();
5745  if (ObtenerValoresDefectoDb(tcDbNombreNuevo, ref ldtValsDefecto))
5746  {
5747  // Actualizar los valores por defecto de la base de datos
5748  if (!CrearGrupoEjer_Actualizar_ValoresDefecto(tcDbNombreViejo, tcDbNombreNuevo, "", ldtValsDefecto))
5749  return false;
5750  }
5751 
5752  if (_Log)
5753  Guardar_Mensaje("Se han revisado los índices y valores por defecto de la base de datos " + tcDbNombreNuevo);
5754 
5755  return true;
5756 
5757  }
5758 
5759 
5766  private static bool ObtenerIndicesDb(string tcDb, ref DataTable dtIndices)
5767  {
5768  bool llOk = false;
5769 
5770  // Obtener en un DataTable los indices de la base de datos
5771  dtIndices = new DataTable();
5772  llOk = DB._DbIndicesCampos(tcDb, ref dtIndices);
5773  if (!llOk)
5774  {
5775  _Error_Message = "No se pudieron obtener los índices de las tablas de la base de datos " + tcDb;
5776  if (_Log)
5777  Guardar_Mensaje(_Error_Message);
5778  return false;
5779  }
5780 
5781  return true;
5782  }
5783 
5790  private static bool ObtenerValoresDefectoDb(string tcDb, ref DataTable dtValoresDefecto)
5791  {
5792  bool llOk = false;
5793 
5794  // Obtener en un DataTable los valores por defecto de las tablas de la base de datos
5795  dtValoresDefecto = new DataTable();
5796  llOk = DB._DbValoresDefectoCampos(tcDb, ref dtValoresDefecto);
5797  if (!llOk)
5798  {
5799  _Error_Message = "No se pudieron obtener los valores por defecto de las tablas de la base de datos " + tcDb;
5800  if (_Log)
5801  Guardar_Mensaje(_Error_Message);
5802  return false;
5803  }
5804 
5805  return true;
5806  }
5807 
5814  private static bool BorrarGrupo_Remove_Bd(string tcDb, string tcMensajeLog = "")
5815  {
5816  bool llOk = true;
5817  string lcComando = "";
5818 
5819  if (!DB._SQLExisteBBDD(tcDb))
5820  {
5821  if (_Log)
5822  Guardar_Mensaje("Se pretendía eliminar la base de datos " + tcMensajeLog + " " + tcDb + " pero no se ha detectado su existencia en el servidor de datos SQL.");
5823  }
5824  else
5825  {
5826  lcComando = "DROP DATABASE [" + tcDb + "]";
5827  if (_Log)
5828  Guardar_Mensaje("Eliminación de la base " + tcMensajeLog + " " + tcDb);
5829 
5830  llOk = DB.SQLExec(lcComando);
5831 
5832  if (_Log)
5833  {
5834  Guardar_Mensaje("Resultado de " + lcComando + ": " + (llOk ? "OK" : "KO"));
5835  if (!llOk && !string.IsNullOrWhiteSpace(DB.Error_Message))
5836  Guardar_Mensaje("Motivo : " + DB.Error_Message);
5837  Guardar_Mensaje("Verificando existencia da la base de datos " + tcDb + " tras borrado.");
5838  }
5839 
5840  if (DB._SQLExisteBBDD(tcDb))
5841  {
5842  llOk = false;
5843  if (_Log)
5844  Guardar_Mensaje("La base de datos " + tcDb + " aún existe en el servidor SQL, no quedó eliminada.");
5845  }
5846  else
5847  {
5848  if (_Log)
5849  Guardar_Mensaje("La base de datos " + tcDb + " fue correctamente eliminada y ya no existe en el servidor SQL: OK");
5850  }
5851  }
5852 
5853  return llOk;
5854  }
5855 
5860  private static bool RevisarBaseDatosEnUso()
5861  {
5862  string lcMensaje = string.Empty;
5863  bool llOk = true;
5864  Dictionary<String, String> dicBds = new Dictionary<string, string> { };
5865  string lcBds = string.Empty;
5866 
5867  // BASES DE DATOS DE LOS ADD-ONS
5868  foreach (DataRow loRow in GrupoempTools._dtBdAddonsGrBorrar.Rows)
5869  dicBds.Add(Convert.ToString(loRow["nom_conex"]).Trim(), Convert.ToString(loRow["nombre"]).Trim());
5870 
5871  // BASES DE DATOS DE LOS EJERCICIOS
5872  foreach (DataRow loRow in GrupoempTools._dtBdEjerGrBorrar.Rows)
5873  dicBds.Add(Convert.ToString(loRow["conexion"]).Trim(), Convert.ToString(loRow["any"]).Trim());
5874 
5875  // BASES DE DATOS DE COMUNES
5876  dicBds.Add(GrupoempTools._DbComunesGrBorrar, "COMUNES");
5877 
5878  // Revisar si alguna de las bases de datos está en uso
5879  foreach (KeyValuePair<String, String> loBd in dicBds)
5880  {
5881  lcMensaje = "";
5882  if (!RevisarEnuso(loBd.Key, ref lcMensaje))
5883  {
5884  lcBds = lcBds + (!string.IsNullOrWhiteSpace(lcBds) ? ", " : " ") + loBd.Key;
5885  llOk = false;
5886  if (_Log)
5887  Guardar_Mensaje(lcMensaje);
5888  }
5889  else
5890  {
5891  if (_Log)
5892  Guardar_Mensaje("La base de datos "+ loBd+" se han cerrado todas las conexiones pendientes.");
5893  }
5894  }
5895 
5896  if (!llOk)
5897  _Error_Message = "Las siguientes bases de datos se encuentran en uso: " + lcBds;
5898 
5899  return llOk;
5900  }
5901 
5902 
5903 
5910  private static bool RevisarEnuso(string tcDb, ref string tcMensajeLog)
5911  {
5912  string lcSql = string.Empty;
5913  bool llOk = false;
5914 
5915  // Si no existe base de datos no hacer nada
5916  if (!DB._SQLExisteBBDD(tcDb))
5917  return true;
5918 
5919  lcSql = "USE master; ";
5920  llOk = DB.SQLExec(lcSql);
5921 
5922  lcSql = "ALTER DATABASE [" + tcDb + "] " +
5923  "SET SINGLE_USER " +
5924  "WITH ROLLBACK IMMEDIATE; " +
5925  "ALTER DATABASE [" + tcDb + "] " +
5926  "SET MULTI_USER; ";
5927  llOk = DB.SQLExec(lcSql);
5928 
5929  if (!llOk)
5930  tcMensajeLog = string.IsNullOrWhiteSpace(DB.Error_Message) ? "En la base de datos " + tcDb + " no se han podido cerrar las conexiones." : DB.Error_Message;
5931 
5932  return llOk;
5933  }
5934 
5935 
5940  private static void Guardar_Mensaje(string tcTexto="")
5941  {
5942  string lcTime;
5943  lcTime = Convert.ToString(DateTime.Now);
5944 
5945  _cCadenaLog.Append((tcTexto != Environment.NewLine ? lcTime + " " + tcTexto : "") + Environment.NewLine);
5946  }
5947 
5952  private static void CopiarStringLog_Fichero(string tcFichero)
5953  {
5954  File.WriteAllText(tcFichero, Convert.ToString(_cCadenaLog), Encoding.UTF8);
5955  }
5956 
5957 
5958 
5964  private static void CrearGrupo_AnadirGrupo_Gruposemp(string tcGrupo, string tcNombreGrupo)
5965  {
5966  DataTable ldtAuxiliar = new DataTable();
5967  string lcIdSage50 = "";
5968 
5969  tcNombreGrupo = !string.IsNullOrWhiteSpace(tcNombreGrupo) ? tcNombreGrupo : "NOMBRE GRUPO";
5970 
5971  DB.SQLExec("select idsage50 from " + DB.SQLDatabaseReal("eurowinsys", "gruposemp") + " " +
5972  "where codigo = " + DB.SQLString(GrupoempTools._GrupoPrincipal), ref ldtAuxiliar);
5973  if (ldtAuxiliar != null && ldtAuxiliar.Rows.Count > 0)
5974  lcIdSage50 = Convert.ToString(ldtAuxiliar.Rows[0]["idsage50"]);
5975 
5976  ldtAuxiliar = new DataTable();
5977  DB.SQLExec("select codigo from " + DB.SQLDatabaseReal("eurowinsys", "gruposemp") + " " +
5978  "where codigo=" + DB.SQLString(tcGrupo), ref ldtAuxiliar);
5979  if (ldtAuxiliar.Rows.Count == 0)
5980  {
5981  if (_Log)
5982  Guardar_Mensaje("Creando registro de grupo en la tabla de grupos.");
5983 
5984  DB.SQLExec("insert into " + DB.SQLDatabaseReal("eurowinsys", "gruposemp") + " (codigo,nombre,codpripal,idsage50) " +
5985  "values (" + DB.SQLString(tcGrupo) + ", " + DB.SQLString(tcNombreGrupo) + ", " + DB.SQLString(GrupoempTools._GrupoPrincipal) + ", " + DB.SQLString(lcIdSage50) + ")");
5986  }
5987  else
5988  {
5989  DB.SQLExec("update " + DB.SQLDatabaseReal("eurowinsys", "gruposemp") + " set nombre = " + DB.SQLString(tcNombreGrupo) + ", idsage50 = " + DB.SQLString(lcIdSage50) +
5990  " where codigo=" + DB.SQLString(tcGrupo));
5991  }
5992 
5993  }
5994 
5995 
6000  private static bool CrearGrupo_AnadirGrupo_CfgCliSrv()
6001  {
6002 
6003  string lcEuroserv = GrupoempTools._Euroserv.Trim();
6004  if (string.IsNullOrWhiteSpace(lcEuroserv))
6005  {
6006  _Error_Message = "No se ha podido añadir la conexión a COMUNES del nuevo grupo al fichero cfgclisrv.xml, no se ha detectado la ruta hacia el servidor (euroserv).";
6007  if (_Log)
6008  Guardar_Mensaje(_Error_Message);
6009  return false;
6010  }
6011 
6012  // Comprobar si existe cfgclisrv.xml
6013  string lcCfgCliSrvXml = Path.Combine(lcEuroserv, "cfgclisrv.xml");
6014  if (!File.Exists(lcCfgCliSrvXml))
6015  {
6016  _Error_Message = "No se ha podido añadir la conexión a COMUNES del nuevo grupo al fichero " + lcCfgCliSrvXml + ", no existe el fichero en dicha ruta.";
6017  if (_Log)
6018  Guardar_Mensaje(_Error_Message);
6019  return false;
6020  }
6021 
6022 
6023 
6024 
6025 
6026  // PASO 1/2 AÑADIR EL NUEVO GRUPO RECIEN CREADO AL CFGCLISRV.XML EN EUROSERV
6027 
6028  // Cargamos el cfgclisrv.xml en memoria
6029  XmlDocument xmlCfgCliSrv = new XmlDocument();
6030  xmlCfgCliSrv.Load(lcCfgCliSrvXml);
6031 
6032 
6033  // Recorremos el XML en busca del registro de la base de datos de COMUNES del grupo origen que se empleó para la creación del nuevo grupo por que cogeremos
6034  // los datos de usuario, password, servidor, de ese registro.
6035  XmlNode VFPDataNode = xmlCfgCliSrv["VFPData"];
6036  string lcUser="", lcPassword="", lcIp="";
6037  bool llConexionFound=false;
6038 
6039  foreach (XmlNode cfgclisrvNode in VFPDataNode.ChildNodes)
6040  {
6041  if (cfgclisrvNode.Name.ToLower().Trim() == "cfgclisrv")
6042  {
6043  if (cfgclisrvNode["comunes"].InnerText.Trim().ToLower() == _DbComunesGrOrigen.Trim().ToLower())
6044  {
6045  // Get values nodes
6046  lcUser = cfgclisrvNode["user"].InnerText;
6047  lcPassword = cfgclisrvNode["password"].InnerText;
6048  lcIp = cfgclisrvNode["ip"].InnerText;
6049  llConexionFound = true;
6050  break;
6051  }
6052  }
6053  }
6054 
6055  // Si no se encontró el registro del COMUNES del grupo origen avisamos de ello y salimos.
6056  if (!llConexionFound)
6057  {
6058  _Error_Message = "No se ha detectado el registro correspondiente a la base de datos de COMUNES "+ _DbComunesGrOrigen+" en "+lcCfgCliSrvXml;
6059  if (_Log)
6060  Guardar_Mensaje(_Error_Message);
6061  return false;
6062  }
6063 
6064 
6065  // Creo el nuevo nodo con los datos de la conexión al nuevo grupo.
6066  try
6067  {
6068 
6069  XmlNode loNodeCfgCliSrv = xmlCfgCliSrv.CreateElement("cfgclisrv");
6070 
6071  XmlNode loNodeUser = xmlCfgCliSrv.CreateElement("user");
6072  loNodeUser.InnerText = lcUser.Trim();
6073  loNodeCfgCliSrv.AppendChild(loNodeUser);
6074 
6075  XmlNode loNodePassword = xmlCfgCliSrv.CreateElement("password");
6076  loNodePassword.InnerText = lcPassword;
6077  loNodeCfgCliSrv.AppendChild(loNodePassword);
6078 
6079  XmlNode loNodeIp = xmlCfgCliSrv.CreateElement("ip");
6080  loNodeIp.InnerText = lcIp.Trim();
6081  loNodeCfgCliSrv.AppendChild(loNodeIp);
6082 
6083  XmlNode loNodePort = xmlCfgCliSrv.CreateElement("port");
6084  loNodePort.InnerText = "0";
6085  loNodeCfgCliSrv.AppendChild(loNodePort);
6086 
6087  XmlNode loNodeComunes = xmlCfgCliSrv.CreateElement("comunes");
6088  loNodeComunes.InnerText = _DbComunesGrNuevo.Trim(); ;
6089  loNodeCfgCliSrv.AppendChild(loNodeComunes);
6090 
6091  XmlNode loNodeServer = xmlCfgCliSrv.CreateElement("server");
6092  loNodeServer.InnerText = "SQLSERVER";
6093  loNodeCfgCliSrv.AppendChild(loNodeServer);
6094 
6095  XmlNode loNodeAutWin = xmlCfgCliSrv.CreateElement("autwin");
6096  loNodeAutWin.InnerText = "false";
6097  loNodeCfgCliSrv.AppendChild(loNodeAutWin);
6098 
6099  XmlNode loNodeOdbc = xmlCfgCliSrv.CreateElement("odbc");
6100  loNodeOdbc.InnerText = "SQL Server Native Client 11.0";
6101  loNodeCfgCliSrv.AppendChild(loNodeOdbc);
6102 
6103  VFPDataNode.AppendChild(loNodeCfgCliSrv);
6104 
6105  xmlCfgCliSrv.Save(lcCfgCliSrvXml);
6106  }
6107  catch (Exception loEx)
6108  {
6109  _Error_Message = "Ha habido un problema al añadir la base de datos de COMUNES del nuevo grupo " + _DbComunesGrNuevo + " al fichero cfgclisrv.xml en euroserv. Mensaje de error: " + loEx.Message;
6110  if (_Log)
6111  Guardar_Mensaje(_Error_Message);
6112  return false;
6113  }
6114 
6115 
6116 
6117  // PASO 2/2 AÑADIR LA BASE DE DATOS DE COMUNES DEL GRUPO RECIEN CREADO A CFGCLISRV.DBF
6118  try
6119  {
6120  // Comprobar si existe cfgclisrv.dbf
6121  string lcCfgCliSrvDbf = Path.Combine(lcEuroserv, "cfgclisrv.dbf");
6122 
6123  // Bug 172594 - Solamente actualizar el cfgclisrv.dbf si existe.
6124  // El proceso de instalación en .NET no crea el fichero cfgclisrv.dbf y daba error al crear un grupo de empresa en el DTS.
6125  if (File.Exists(lcCfgCliSrvDbf))
6126  {
6127  DataTable dtDbf = new DataTable();
6128  OdbcConnection loConn = new OdbcConnection();
6129  OdbcCommand loCmd = loConn.CreateCommand();
6130 
6131  loConn.ConnectionString = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + lcEuroserv + ";";
6132 
6133  if (!lcEuroserv.Trim().EndsWith("\\"))
6134  lcEuroserv = lcEuroserv.Trim() + "\\";
6135 
6136  loConn.Open();
6137 
6138  loCmd.CommandText = @"SELECT * FROM " + lcEuroserv + "CFGCLISRV.DBF WHERE !deleted() and comunes = '" + _DbComunesGrNuevo.Trim() + "' and ip='"+ lcIp.Trim()+"'";
6139  dtDbf.Load(loCmd.ExecuteReader());
6140 
6141  // Miro si existen en CFGCLISRV.DBF las columnas AUTWIN y ODBC, y caso de que existen las relleno con los valores
6142  // correspondientes.
6143  //
6144  bool llColumnaAutWin = dtDbf.Columns.Contains("autwin");
6145  string lcNombreColumnas = "", lcValoresColumnas = "";
6146  if (llColumnaAutWin)
6147  {
6148  lcNombreColumnas = " , autwin";
6149  lcValoresColumnas = " , "+DB.SQLFalse();
6150  }
6151 
6152  bool llColumnaOdbc = dtDbf.Columns.Contains("odbc");
6153  if (llColumnaOdbc)
6154  {
6155  lcNombreColumnas += ", odbc";
6156  lcValoresColumnas += ", "+DB.SQLString("SQL Server Native Client 11.0");
6157  }
6158 
6159  // PE-90892 - Controlar que exista un registro
6160  if (dtDbf.Rows.Count == 0)
6161  {
6162  loCmd.CommandText = "INSERT INTO cfgclisrv (user, password, ip, port, comunes, server "+ lcNombreColumnas + ") "+
6163  "VALUES ('" + lcUser.Trim() + "','" + lcPassword.Trim() + "','" + lcIp.Trim() + "',0,'" + _DbComunesGrNuevo + "','SQLSERVER'"+lcValoresColumnas+")";
6164  loCmd.ExecuteNonQuery();
6165  }
6166 
6167  loConn.Close();
6168 
6169  dtDbf.Dispose();
6170  }
6171  }
6172  catch (Exception loEx)
6173  {
6174  // _Error_Message = "Ha habido un problema al añadir la base de datos de COMUNES del nuevo grupo "+_DbComunesGrNuevo+" al fichero cfgclisrv.dbf en euroserv. Mensaje de error: "+loEx.Message;
6175  if (_Log)
6176  Guardar_Mensaje("Ha habido un problema al añadir la base de datos de COMUNES del nuevo grupo " + _DbComunesGrNuevo + " al fichero cfgclisrv.dbf en euroserv. Mensaje de error: " + loEx.Message);
6177  // ATENCION !!!
6178  // Contrariamente al caso del XML aqui si algo no va bien no cancelo la creación del grupo por que podria ser que en este terminal no hubiera el driver de FOXPRO y no funcionaria pero no por eso
6179  // hemos de dar por fallo el proceso, no podrá entrar en el nuevo grupo con el UTILCS.EXE por que a dia de hoy no se mira el CFGCLISRV.XML sino el DBF, pero a Sage50 con el nuevo grupo si que podrá
6180  // entrar por que Sage50 sí mira el XML y no el DBF.
6181  }
6182 
6183 
6184 
6185 
6186  return true;
6187  }
6188 
6194  public static bool _BorrarGrupo_QuitarGrupo_CfgCliSrv(string tcGrupo)
6195  {
6196 
6197  // Se puede llamar también desde frmGruporEmp si se borra un grupo en modo desvinculación (no borrado), de ahí que sea publica.
6198  string lcEuroserv = GrupoempTools._Euroserv.Trim();
6199 
6200  if (string.IsNullOrWhiteSpace(lcEuroserv))
6201  {
6202  _Error_Message = "No se ha podido borrar la conexión a COMUNES del grupo del fichero cfgclisrv.xml y dbf, no se ha detectado la ruta hacia el servidor (euroserv).";
6203  if (_Log)
6204  Guardar_Mensaje(_Error_Message);
6205  return false;
6206  }
6207 
6208  // Comprobar si existe cfgclisrv.xml
6209  string lcCfgCliSrvXml = Path.Combine(lcEuroserv, "cfgclisrv.xml");
6210  if (!File.Exists(lcCfgCliSrvXml))
6211  {
6212  _Error_Message = "No se ha podido borrar la conexión a COMUNES del grupo del fichero " + lcCfgCliSrvXml + ", no existe el fichero en dicha ruta.";
6213  if (_Log)
6214  Guardar_Mensaje(_Error_Message);
6215  return false;
6216  }
6217 
6218 
6219 
6220 
6221  // QUITAR EL GRUPO DE CFGCLISRV.XML EN EUROSERV
6222 
6223  // Cargamos el cfgclisrv.xml en memoria
6224  XmlDocument xmlCfgCliSrv = new XmlDocument();
6225  xmlCfgCliSrv.Load(lcCfgCliSrvXml);
6226 
6227 
6228  // Recorremos el XML en busca del registro de la base de datos de COMUNES del grupo que se pretende borrar.
6229  XmlNode VFPDataNode = xmlCfgCliSrv["VFPData"];
6230  bool llConexionFound = false;
6231 
6232  // Conexion a COMUNES del grupo que se borra.
6233  string lcDbComunes = "COMU" + tcGrupo;
6234 
6235  XmlNode loNodoConex = null;
6236 
6237  foreach (XmlNode cfgclisrvNode in VFPDataNode.ChildNodes)
6238  {
6239  if (cfgclisrvNode.Name.ToLower().Trim() == "cfgclisrv")
6240  {
6241  if (cfgclisrvNode["comunes"].InnerText.Trim().ToLower() == lcDbComunes.Trim().ToLower())
6242  {
6243  loNodoConex = cfgclisrvNode;
6244 
6245  llConexionFound = true;
6246  break;
6247  }
6248  }
6249  }
6250 
6251  // Si no se encontró el registro del COMUNES del grupo avisamos de ello pero no damos error pues es justamente lo que se pretende, que no exista el registro.
6252  if (!llConexionFound)
6253  {
6254  _Error_Message = "No se ha detectado el registro correspondiente a la base de datos de COMUNES " + lcDbComunes + " en " + lcCfgCliSrvXml;
6255  if (_Log)
6256  Guardar_Mensaje(_Error_Message);
6257  }
6258  else
6259  {
6260  // Quito el nodo con los datos de la conexión del grupo.
6261  try
6262  {
6263 
6264  VFPDataNode.RemoveChild(loNodoConex);
6265 
6266  xmlCfgCliSrv.Save(lcCfgCliSrvXml);
6267  }
6268  catch (Exception loEx)
6269  {
6270  _Error_Message = "Ha habido un problema al borrar la base de datos de COMUNES del grupo " + tcGrupo + " del fichero cfgclisrv.xml en euroserv. Mensaje de error: " + loEx.Message;
6271  if (_Log)
6272  Guardar_Mensaje(_Error_Message);
6273  // No por esto vamos a devolver false, pues si ha llegado hasta aquí, el grupo ya ha sido borrado.
6274  }
6275  }
6276 
6277 
6278  // QUITAR EL GRUPO DE CFGCLISRV.DBF EN EUROSERV
6279  try
6280  {
6281  DataTable dtDbf = new DataTable();
6282  OdbcConnection loConn = new OdbcConnection();
6283  OdbcCommand loCmd = loConn.CreateCommand();
6284 
6285  // Comprobar si existe cfgclisrv.dbf
6286  string lcCfgCliSrvDbf = Path.Combine(lcEuroserv, "cfgclisrv.dbf");
6287  if (!File.Exists(lcCfgCliSrvDbf))
6288  {
6289  _Error_Message = "No se ha podido actualizar el fichero " + lcCfgCliSrvDbf + ", no existe el fichero en dicha ruta.";
6290  if (_Log)
6291  Guardar_Mensaje(_Error_Message);
6292  return true;
6293  // No por esto vamos a devolver false, pues si ha llegado hasta aquí, el grupo ya ha sido borrado
6294  }
6295 
6296  loConn.ConnectionString = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + lcEuroserv + ";";
6297 
6298  if (!lcEuroserv.Trim().EndsWith("\\"))
6299  lcEuroserv = lcEuroserv.Trim() + "\\";
6300 
6301  loConn.Open();
6302 
6303  loCmd.CommandText = @"SELECT * FROM " + lcEuroserv + "CFGCLISRV.DBF WHERE !deleted() and comunes = '" + lcDbComunes.Trim().ToUpper() + "' ";
6304  dtDbf.Load(loCmd.ExecuteReader());
6305 
6306  if (dtDbf.Rows.Count > 0)
6307  {
6308  loCmd.CommandText = "DELETE FROM cfgclisrv WHERE !deleted() and comunes = '" + lcDbComunes.Trim().ToUpper() + "'";
6309  loCmd.ExecuteNonQuery();
6310  }
6311 
6312  loConn.Close();
6313 
6314  dtDbf.Dispose();
6315  }
6316  catch (Exception loEx)
6317  {
6318  if (_Log)
6319  Guardar_Mensaje("Ha habido un problema al eliminar el registro del grupo " + lcDbComunes + " del fichero cfgclisrv.dbf en euroserv. Mensaje de error: " + loEx.Message);
6320  // No por esto vamos a devolver false, pues si ha llegado hasta aquí, el grupo ya ha sido borrado.
6321  }
6322 
6323 
6324 
6325  return true;
6326 
6327  }
6328 
6334  private static void CrearGrupo_AsignarPropiedades(Dictionary<string, object> loDicParametros)
6335  {
6336  // DAMOS VALOR A LAS PROPIEDADES SEGUN LOS PARAMETROS RECIBIDOS
6337  // Si no han declarado el usuario propietario de las nuevas bases de datos que se creen lo ponemos nosotros
6338  if (string.IsNullOrWhiteSpace(_UserPropBdGrNuevo))
6339  GrupoempTools._UserPropBdGrNuevo = "Sage50";
6340 
6341  string tcEjercicio = Convert.ToString(loDicParametros["tcejercicio"]);
6342  bool tlEjerPartido = Convert.ToBoolean(loDicParametros["tlejerpartido"]);
6343 
6344  DateTime? tdEjerPartiFIni=null, tdEjerPartiFFin=null;
6345  if (loDicParametros["tdejerpartifini"] != null)
6346  tdEjerPartiFIni = Convert.ToDateTime(loDicParametros["tdejerpartifini"]);
6347  if (loDicParametros["tdejerpartiffin"] != null)
6348  tdEjerPartiFFin = Convert.ToDateTime(loDicParametros["tdejerpartiffin"]);
6349 
6350  bool tlConservarClientes = Convert.ToBoolean(loDicParametros["tlconservarclientes"]);
6351  bool tlConservarUsuarios = Convert.ToBoolean(loDicParametros["tlconservarusuarios"]);
6352  string tcNombreEmpresa = Convert.ToString(loDicParametros["tcnombreempresa"]);
6353  string tcCifEmpresa = Convert.ToString(loDicParametros["tccifempresa"]);
6354 
6355 
6356  // Estas propiedades ya las captamos de la llamada
6357  GrupoempTools._EjerNuevo = tcEjercicio;
6358  GrupoempTools._CfgEjerPartiGrNuevo = tlEjerPartido;
6359  if (tlEjerPartido)
6360  {
6361  // Fechas periodo para ejercicio partido
6362  GrupoempTools._FechaIniEjerNuevo = tdEjerPartiFIni;
6363  GrupoempTools._FechaFinEjerNuevo = tdEjerPartiFFin;
6364  }
6365  else
6366  {
6367  // Fechas periodo para ejercicio natural
6368  GrupoempTools._FechaIniEjerNuevo = Convert.ToDateTime("01/01/" + tcEjercicio);
6369  GrupoempTools._FechaFinEjerNuevo = Convert.ToDateTime("31/12/" + tcEjercicio);
6370  }
6371  GrupoempTools._ConservarClientes = tlConservarClientes;
6372  GrupoempTools._ConservarUsuarios = tlConservarUsuarios;
6373  GrupoempTools._NombreEmpresa = !string.IsNullOrWhiteSpace(tcNombreEmpresa) ? tcNombreEmpresa : "NOMBRE EMPRESA";
6374  GrupoempTools._CifEmpresa = tcCifEmpresa;
6375 
6376  // El ejercicio que se crea en el nuevo grupo siempre quedará marcado como predeterminado en COMUNES!EJERCICI
6377  GrupoempTools._EjerNuevoMarcarPredet = true;
6378 
6379  // Asignar propiedad de creación con longitudes estandar
6380  GrupoempTools._LongitudesEstandar = Convert.ToBoolean(loDicParametros["tlLongitudesEstandar"]);
6381  }
6382 
6383 
6384 
6385 
6390  private static bool CrearEjercicio_Comprobar_Parametros(Dictionary<string, object> loDicParametros)
6391  {
6392 
6393  // Si no hay conexión a una instancia de servidor SQL no hay nada que hacer.
6394  _Error_Message = "";
6395  if (string.IsNullOrWhiteSpace(DB.Conexion) || string.IsNullOrWhiteSpace(DB.DbComunes))
6396  {
6397  _Error_Message = "No se ha detectado conexión al servidor SQL, no se creará el grupo.";
6398  if (_Log)
6399  Guardar_Mensaje(_Error_Message);
6400  return false;
6401  }
6402 
6403 
6404  // Código de grupo origen para la creación del nuevo ejercicio.
6405  string tcGrupoOrigen = Convert.ToString(loDicParametros["tcgrupoorigen"]);
6406  if (string.IsNullOrWhiteSpace(tcGrupoOrigen))
6407  {
6408  _Error_Message = "Error en los parámetros de entrada. No se ha especificado el parámetro 'Código de grupo origen' (tcGrupoOrigen)";
6409  if (_Log)
6410  Guardar_Mensaje(_Error_Message);
6411  return false;
6412  }
6413  else
6414  {
6415  // Código de grupo origen si se pasa ha de tener 4 dígitos.
6416  if (tcGrupoOrigen.Trim().Length != 4)
6417  {
6418  _Error_Message = "Error en los parámetros de entrada. El parámetro 'Código de grupo origen' (tcGrupoOrigen) debe tener 4 dígitos.";
6419  if (_Log)
6420  Guardar_Mensaje(_Error_Message);
6421  return false;
6422  }
6423 
6424  }
6425 
6426 
6427  // Código de ejercicio origen a utilizar en la creación del nuevo ejercicio.
6428  string tcEjerOrigen = Convert.ToString(loDicParametros["tcejerorigen"]);
6429  if (string.IsNullOrWhiteSpace(tcEjerOrigen))
6430  {
6431  _Error_Message = "Error en los parámetros de entrada. No se ha especificado el parámetro 'Ejercicio origen' (tcEjerOrigen).";
6432  if (_Log)
6433  Guardar_Mensaje(_Error_Message);
6434  return false;
6435  }
6436  else
6437  {
6438  // Código de ejercicio origen ha de tener 4 dígitos.
6439  if (tcEjerOrigen.Trim().Length != 4)
6440  {
6441  _Error_Message = "Error en los parámetros de entrada. El parámetro 'Código de ejercicio origen' (tcEjerOrigen) debe tener 4 dígitos.";
6442  if (_Log)
6443  Guardar_Mensaje(_Error_Message);
6444  return false;
6445  }
6446  else
6447  {
6448  int lnEjerOrigen = Convert.ToInt32(tcEjerOrigen);
6449  if (lnEjerOrigen == 0 || lnEjerOrigen < 1980) // 1980 por poner algo
6450  {
6451  _Error_Message = "Error en los parámetros de entrada. El parámetro 'Código de ejercicio origen' (tcEjerOrigen) no tiene el formato correcto, debe tener 4 dígitos: "+tcEjerOrigen;
6452  if (_Log)
6453  Guardar_Mensaje(_Error_Message);
6454  return false;
6455  }
6456  }
6457  }
6458 
6459 
6460 
6461 
6462  // Código de ejercicio a crear en el grupo ha de estar informado.
6463  string tcEjerNuevo = Convert.ToString(loDicParametros["tcejernuevo"]);
6464  if (string.IsNullOrWhiteSpace(tcEjerNuevo))
6465  {
6466  _Error_Message = "Error en los parámetros de entrada. No se ha especificado el parámetro 'Ejercicio a crear' (tcEjerNuevo).";
6467  if (_Log)
6468  Guardar_Mensaje(_Error_Message);
6469  return false;
6470  }
6471  else
6472  {
6473  // Código de ejercicio a crear ha de tener 4 dígitos.
6474  if (tcEjerNuevo.Trim().Length != 4)
6475  {
6476  _Error_Message = "Error en los parámetros de entrada. El parámetro 'Código de ejercicio a creear' (tcEjerNuevo) debe tener 4 dígitos.";
6477  if (_Log)
6478  Guardar_Mensaje(_Error_Message);
6479  return false;
6480  }
6481  else
6482  {
6483  int lnEjerNuevo = Convert.ToInt32(tcEjerNuevo);
6484  if (lnEjerNuevo == 0 || lnEjerNuevo < 1980) // 1980 por poner algo
6485  {
6486  _Error_Message = "Error en los parámetros de entrada. El parámetro 'Código de ejercicio a crear' (tcEjerNuevo) no tiene el formato correcto, debe tener 4 dígitos: " + tcEjerNuevo;
6487  if (_Log)
6488  Guardar_Mensaje(_Error_Message);
6489  return false;
6490  }
6491  }
6492  }
6493 
6494 
6495  // Código de ejercicio a crear ha de ser diferente del codigo de ejercicio origen
6496  if (!string.IsNullOrWhiteSpace(tcEjerOrigen) && !string.IsNullOrWhiteSpace(tcEjerNuevo) && tcEjerNuevo == tcEjerOrigen)
6497  {
6498  _Error_Message = "Error en los parámetros de entrada. Ejercicio origen (tcEjerOrigen) y ejercicio a crear (tcEjerNuevo) no pueden ser iguales.";
6499  if (_Log)
6500  Guardar_Mensaje(_Error_Message);
6501  return false;
6502  }
6503 
6504  // Comprobar que las fechas esten correctamente introducidas
6505  DateTime tdFIniEjerNuevo = Convert.ToDateTime(loDicParametros["tdfiniejernuevo"]);
6506  DateTime tdFFinEjerNuevo = Convert.ToDateTime(loDicParametros["tdffinejernuevo"]);
6507 
6508  if (tdFIniEjerNuevo == null || tdFFinEjerNuevo == null)
6509  {
6510  _Error_Message = "Error en los parámetros de entrada. No se ha declarado alguna de las fechas del ejercicio.";
6511  if (_Log)
6512  Guardar_Mensaje(_Error_Message);
6513  return false;
6514  }
6515 
6516  if (tdFIniEjerNuevo.Year < 1980 || tdFFinEjerNuevo.Year < 1980)
6517  {
6518  _Error_Message = "Error en los parámetros de entrada. La fecha de inicio de ejercicio o la fecha fin de ejercicio no parecen ser correctas.";
6519  if (_Log)
6520  Guardar_Mensaje(_Error_Message);
6521  return false;
6522  }
6523 
6524  if (tdFIniEjerNuevo >= tdFFinEjerNuevo)
6525  {
6526  _Error_Message = "Error en los parámetros de entrada. La fecha final del nuevo ejercicio no puede ser inferior a la fecha inicial.";
6527  if (_Log)
6528  Guardar_Mensaje(_Error_Message);
6529  return false;
6530  }
6531  return true;
6532  }
6533 
6534 
6535 
6540  private static bool CrearGrupo_Comprobar_Parametros(Dictionary<string,object> loDicParametros)
6541  {
6542  // Si no hay conexión a una instancia de servidor SQL no hay nada que hacer.
6543  _Error_Message = "";
6544  if (string.IsNullOrWhiteSpace(DB.Conexion) || string.IsNullOrWhiteSpace(DB.DbComunes))
6545  {
6546  _Error_Message = "No se ha detectado conexión al servidor SQL, no se creará el grupo.";
6547  if (_Log)
6548  Guardar_Mensaje(_Error_Message);
6549  return false;
6550  }
6551 
6552  // Verificar que tenemos la dirección de EUROSERV pues al acabar la creación hay que actualizar CFGCLISRV.XML en EUROSERV
6553  if (string.IsNullOrWhiteSpace(GrupoempTools._Euroserv))
6554  {
6555  _Error_Message = "No se ha dado valor a la propiedad _Euroserv de la clase GrupoempTools y es necesaria para la creación del grupo, no se creará el grupo.";
6556  if (_Log)
6557  Guardar_Mensaje(_Error_Message);
6558  return false;
6559  }
6560 
6561 
6562 
6563  // CONTROL DE RECEPCION DE PARAMETROS MINIMOS
6564 
6565  // Código de grupo a crear ha de estar informado.
6566  string tcGrupo = Convert.ToString(loDicParametros["tcgrupo"]);
6567  if (string.IsNullOrWhiteSpace(tcGrupo))
6568  {
6569  _Error_Message = "Error en los parámetros de entrada. No se ha especificado el parámetro 'Código de grupo a crear'.";
6570  if (_Log)
6571  Guardar_Mensaje(_Error_Message);
6572  return false;
6573  }
6574 
6575 
6576 
6577  // Si se pasa código de grupo origen hay que validar cosas.
6578  string tcGrOrigen = Convert.ToString(loDicParametros["tcgrorigen"]);
6579  if (!string.IsNullOrWhiteSpace(tcGrOrigen))
6580  {
6581  // Código de grupo origen si se pasa ha de tener 4 dígitos.
6582  if (tcGrOrigen.Trim().Length != 4)
6583  {
6584  _Error_Message = "Error en los parámetros de entrada. El parámetro tcGrOrigen (grupo origen es opcional pero caso de pasarse debe tener 4 dígitos";
6585  if (_Log)
6586  Guardar_Mensaje(_Error_Message);
6587  return false;
6588  }
6589  else if (tcGrupo == tcGrOrigen)
6590  {
6591  // Código de grupo origen ha de ser diferente código de grupo si se pasa ha de tener 4 dígitos.
6592  _Error_Message = "Error en los parámetros de entrada. El parámetro tcGrOrigen (grupo origen) es opcional pero caso de pasarse debe ser diferente al código de grupo a crear.";
6593  if (_Log)
6594  Guardar_Mensaje(_Error_Message);
6595  return false;
6596  }
6597  }
6598 
6599  // Código de ejercicio a crear en el nuevo grupo ha de estar informado.
6600  string tcEjercicio = Convert.ToString(loDicParametros["tcejercicio"]);
6601  if (string.IsNullOrWhiteSpace(tcEjercicio))
6602  {
6603  _Error_Message = "Error en los parámetros de entrada. No se ha especificado el parámetro 'Ejercicio' en el nuevo grupo.";
6604  if (_Log)
6605  Guardar_Mensaje(_Error_Message);
6606  return false;
6607  }
6608  else
6609  {
6610  // Código de ejercicio a crear ha de tener 4 dígitos.
6611  if (tcEjercicio.Trim().Length != 4)
6612  {
6613  _Error_Message = "Error en los parámetros de entrada. El parámetro 'Ejercicio' debe tener 4 dígitos: " + tcEjercicio;
6614  if (_Log)
6615  Guardar_Mensaje(_Error_Message);
6616  return false;
6617  }
6618  else
6619  {
6620  int lnEjercicio = Convert.ToInt32(tcEjercicio);
6621  if (lnEjercicio == 0 || lnEjercicio < 1980) // 1980 por poner algo
6622  {
6623  _Error_Message = "Error en los parámetros de entrada. El parámetro 'Ejercicio' no tiene el formato correcto, debe tener 4 dígitos: " + tcEjercicio;
6624  if (_Log)
6625  Guardar_Mensaje(_Error_Message);
6626  return false;
6627  }
6628  }
6629  }
6630 
6631 
6632  // Caso de especificar trabajar con ejercicio partido se tienen que especificar las fechas inicio y fin de ejercicio.
6633  bool tlEjerPartido = Convert.ToBoolean(loDicParametros["tlejerpartido"]);
6634  if (tlEjerPartido)
6635  {
6636  DateTime? tdEjerPartiFIni = null, tdEjerPartiFFin = null;
6637  if (loDicParametros["tdejerpartifini"] != null)
6638  tdEjerPartiFIni = Convert.ToDateTime(loDicParametros["tdejerpartifini"]);
6639  if (loDicParametros["tdejerpartiffin"] != null)
6640  tdEjerPartiFFin = Convert.ToDateTime(loDicParametros["tdejerpartiffin"]);
6641 
6642  if (tdEjerPartiFIni == null || tdEjerPartiFFin == null)
6643  {
6644  _Error_Message = "Error en los parámetros de entrada. Se ha recibido el parámetro para la configuración de modo de trabajo " +
6645  "con ejercicio partido en el nuevo grupo, pero no se han especificado los parámetros de fecha inicial y final del ejercicio.";
6646  if (_Log)
6647  Guardar_Mensaje(_Error_Message);
6648  return false;
6649  }
6650  }
6651 
6652  return true;
6653  }
6654 
6655 
6660  private static bool CrearEjercicio_BackupBd()
6661  {
6662  bool llOk = false;
6663 
6664  if (_Log)
6665  Guardar_Mensaje("INICIO PROCESO DE COPIA DE BASE DE DATOS DE EJERCICIO"+Environment.NewLine);
6666 
6667 
6668  // COPIA BASE DE DATOS DE EJERCICIO DEL grupo origen
6669  llOk = GrupoempTools.Backup_Bd(GrupoempTools._DbEjerGrOrigen, "EJERCICIO");
6670  if (!llOk)
6671  return false;
6672 
6673  if (_Log)
6674  {
6675  Guardar_Mensaje(Environment.NewLine);
6676  Guardar_Mensaje("PROCESO DE COPIA DE BASE DE DATOS DE EJERCICIO FINALIZADO CORRECTAMENTE." + Environment.NewLine);
6677  }
6678 
6679  return true;
6680  }
6681 
6682 
6687  private static bool CrearEjercicio_RestoreBd()
6688  {
6689  bool llOk = false;
6690 
6691  if (_Log)
6692  Guardar_Mensaje("INICIO PROCESO DE RESTAURACIÓN DE BASE DE DATOS DE EJERCICIO." + Environment.NewLine);
6693 
6694  // RESTAURACION BD EJERCICIO CON NUEVO NOMBRE
6695  llOk = GrupoempTools.Restore_Bd(GrupoempTools._DbEjerGrOrigen, GrupoempTools._DbEjerGrNuevo, "EJERCICIO");
6696  if (!llOk)
6697  return false;
6698 
6699  if (_Log)
6700  {
6701  Guardar_Mensaje(Environment.NewLine);
6702  Guardar_Mensaje("PROCESO DE RESTAURACIÓN DE BASE DE DATOS FINALIZADO CORRECTAMENTE." + Environment.NewLine);
6703  }
6704 
6705  return true;
6706  }
6707 
6708 
6713  private static bool CrearEjercicio_AjustarDatosBd()
6714  {
6715  bool llOk = false;
6716  string lcSql = "";
6717  string lcAnyoAnterior = "";
6718 
6719  // AJUSTES EN LA BASE DE DATOS EJERCICIO RECIEN CREADA DEL GRUPO
6720  llOk = GrupoempTools.AjustarDatos_Bd(_DbEjerGrNuevo, "GESTION");
6721  if (!llOk)
6722  return false;
6723 
6724  // Ahora hay obtener el año anterior al que estamos creando para actualizar el campo ANTERIOR del registro que acabamos de añadir
6725  DataTable ldtAuxiliar = new DataTable();
6726  DB.SQLExec("select top 1 * from " + DB.SQLDatabaseReal(_DbComunesGrOrigen, "EJERCICI") + " where [any]<" + _EjerNuevo + " order by [any] desc", ref ldtAuxiliar);
6727  if (ldtAuxiliar.Rows.Count > 1)
6728  lcAnyoAnterior = Convert.ToString(ldtAuxiliar.Rows[0]["any"]);
6729 
6730 
6731  // Agrego el registro del ejercicio recien creado a COMUNES!EJERCICI marcando PREDET o no según hayan escogido
6732  lcSql = "INSERT INTO " + DB.SQLDatabaseReal(_DbComunesGrOrigen, "EJERCICI") + " ([ANY], RUTA, RUTASER, CONEXION, PERIODOINI, PERIODOFIN, PREDET, ANTERIOR) VALUES (" +
6733  "'" + _EjerNuevo + "', " +
6734  "'" + _DbEjerGrNuevo + "', " +
6735  "'" + _DbEjerGrNuevo + "', " +
6736  "'" + _DbEjerGrNuevo + "', " +
6737  DB.SQLString(_FechaIniEjerNuevo) + ", " +
6738  DB.SQLString(_FechaFinEjerNuevo) + ", " +
6739  (GrupoempTools._EjerNuevoMarcarPredet ? DB.SQLTrue() : DB.SQLFalse()) + " , " +
6740  "'" + lcAnyoAnterior + "')";
6741  DB.SQLExec(lcSql);
6742 
6743  // Caso de que hayan escogido marcar como predeterminado el ejercicio nuevo que se ha creado, hay que quitar la marca de PREDET al ejercicio que pudiera tenerla
6744  if (GrupoempTools._EjerNuevoMarcarPredet)
6745  {
6746  lcSql = "UPDATE " + DB.SQLDatabaseReal(_DbComunesGrOrigen, "EJERCICI") + " SET PREDET=" + DB.SQLFalse() +
6747  "WHERE [ANY] != '" + _EjerNuevo + "'";
6748  DB.SQLExec(lcSql);
6749  }
6750 
6751  // Añadir las cuentas contables básicas a la tabla CUENTAS del nuevo grupo
6752  AjustarTablaCuentas_Paso2();
6753 
6754  return true;
6755  }
6756 
6763  private static bool CrearGrupo_Longitudes()
6764  {
6765  // Copiar los diccionarios de la DB
6766  CopiaDiccionarios(true);
6767 
6768  // Cargar las bases de datos del comunes del nuevo grupo
6769  DB._Cargar_Alias_DB(_DbComunesGrNuevo);
6770 
6771  // Añadir los módulos al diccionario
6772  CargarBDs_modulos();
6773 
6774  bool llOk = CrearGrupo_Longitudes_Grupo();
6775 
6776  // Restaurar los diccionarios de la DB
6777  CopiaDiccionarios(false);
6778 
6779  return llOk;
6780  }
6781 
6782 
6787  private static bool CrearGrupo_Longitudes_Grupo()
6788  {
6789  bool llOk = false;
6790  string lcClave = String.Empty;
6791  int lnPos = 0;
6792  int lnLong = 0;
6793  string lcRelleno = String.Empty;
6794 
6795  // Inicio proceso
6796  if (_Log)
6797  Guardar_Mensaje("INICIO PROCESO AJUSTE LONGITUDES ESTÁNDAR EN EL NUEVO GRUPO." + Environment.NewLine);
6798 
6799 
6800  Dictionary<string, int> dicCamposAmplia = new Dictionary<string, int>();
6801 
6802  // Obtener los campos clave que tienen una longitud diferente de estándar
6803  llOk = DB._ObtenerCamposAmpliados(ref dicCamposAmplia);
6804  if (!llOk)
6805  return false;
6806 
6807  // Si no hay campos ampliados, no hacer nada
6808  if (dicCamposAmplia.Count() == 0)
6809  {
6810  if (_Log)
6811  Guardar_Mensaje("NO SE HAN DETECTADO CAMPOS AMPLIADOS." + Environment.NewLine);
6812  return true;
6813  }
6814 
6815  llOk = true;
6816 
6817  // Realizar adaptaciones antes de cambiar longitud
6818  CrearGrupo_Longitudes_Antes(dicCamposAmplia);
6819 
6820  // Recorrer el diccionario de campos ampliados y cambiar la longitud
6821  foreach (KeyValuePair<string, int> campo in dicCamposAmplia)
6822  {
6823  lcClave = campo.Key;
6824  lnLong = campo.Value;
6825  lnPos = 0;
6826  if (lcClave.Trim().ToUpper() == "CUENTAS")
6827  lnPos = 4;
6828 
6829  if (_Log)
6830  Guardar_Mensaje("CAMBIAR LA LONGITUD CLAVE " + lcClave + " A " + lnLong + " DÍGITOS.");
6831 
6832  // Cambiar longitud campo de una clave
6833  llOk = DB._CambiarLongitudCampo(lcClave, lnLong, lcRelleno, lnPos, 1);
6834  if (!llOk)
6835  {
6836  if (_Log)
6837  Guardar_Mensaje("Error al cambiar longitud de la clave " + lcClave + ": " + DB.Error_Message + Environment.NewLine);
6838  break;
6839  }
6840  else
6841  {
6842  if (_Log)
6843  Guardar_Mensaje("CAMBIADA CORRECTAMENTE LA LONGITUD CLAVE " + lcClave + " A " + lnLong + " DÍGITOS." + Environment.NewLine);
6844  }
6845  }
6846 
6847  if (_Log)
6848  Guardar_Mensaje("FIN PROCESO AJUSTE AJUSTE LONGITUDES ESTÁNDAR EN EL NUEVO GRUPO." + Environment.NewLine);
6849 
6850  return llOk;
6851  }
6852 
6853 
6857  public static void CargarBDs_modulos()
6858  {
6859  DataTable loBds = new DataTable();
6860  String lcNombre = string.Empty;
6861  String lcConex = string.Empty;
6862 
6863  DB.SQLExec("SELECT nombre, nombre2, nom_conex, activo, visible, instalado " +
6864  " FROM " + DB.SQLDatabase("COMUNES", "MODULOS") +
6865  " WHERE nombre != 'EWTOOLS' " +
6866  " Order by nombre ", ref loBds);
6867 
6868  foreach (DataRow loRow in loBds.Rows)
6869  {
6870  lcNombre = loRow["nombre"].ToString().ToUpper().Trim();
6871  lcConex = loRow["nom_conex"].ToString().ToLower().Trim();
6872 
6873  if (!string.IsNullOrEmpty(lcConex))
6874  {
6875  lcConex = "[" + lcConex + "].dbo.";
6876  DB._oAliasDB.Add(lcNombre, lcConex);
6877  }
6878  }
6879 
6880  }
6881 
6882 
6887  private static void CopiaDiccionarios(Boolean tlCopia)
6888  {
6889  if (tlCopia)
6890  {
6891  _oAliasDBCopia = new Dictionary<string, string>(DB._oAliasDB);
6892  _oAliasDBEjerCopia = new Dictionary<string, string>(DB._oAliasDBEjer);
6893  _dicCacheSchemaCopia = new Dictionary<string, DB._TableInformationSchema>(DB._dicCacheSchema);
6894  }
6895  else
6896  {
6897  DB._oAliasDB.Clear();
6898  DB._oAliasDBEjer.Clear();
6899  DB._dicCacheSchema.Clear();
6900 
6901  DB._oAliasDB = new Dictionary<string, string>(_oAliasDBCopia);
6902  DB._oAliasDBEjer = new Dictionary<string, string>(_oAliasDBEjerCopia);
6903  DB._dicCacheSchema = new Dictionary<string, DB._TableInformationSchema>(_dicCacheSchemaCopia);
6904  }
6905 
6906  }
6907 
6912  private static void CrearGrupo_Longitudes_Antes(Dictionary<string, int> _dicCamposAmplia)
6913  {
6914  if (_dicCamposAmplia.ContainsKey("CUENTAS"))
6915  DB.SQLExec("TRUNCATE TABLE " + DB.SQLDatabaseReal(_DbEjerGrNuevo, "CUENTAS"));
6916  }
6917 
6918 
6922  private static void ObtenerAddonsBase()
6923  {
6924  // Mirar si existe el campo BASE en la tabla MODULOS
6925  if (!DB.SQLExisteCampo("COMUNES", "MODULOS", "BASE"))
6926  return;
6927 
6928  DataTable loBds = new DataTable();
6929 
6930  DB.SQLExec("SELECT nombre " +
6931  " FROM " + DB.SQLDatabaseReal(GrupoempTools._DbComunesGrOrigen, "modulos") +
6932  " WHERE nombre != 'EWTOOLS' and (base = " + DB.SQLTrue() + " or (visible = " + DB.SQLTrue() + " and instalado = "+DB.SQLTrue()+")) " + //Bug 155134
6933  " Order by nombre ", ref loBds);
6934 
6935  if (loBds == null || loBds.Rows.Count == 0)
6936  return;
6937 
6938  // Pasar los addons a la lista de addons
6939  _AddonsInstal = loBds.Rows.OfType<DataRow>()
6940  .Select(dr => dr.Field<string>("nombre").Trim()).ToList();
6941 
6942  // En el caso, que exista algún error, ponemos los addons directamente
6943  if (_AddonsInstal.Count == 0)
6944  _AddonsInstal = new List<string>() { "TPV", "LOTES", "AMORTIZA", "MAYORIST", "INFORAUT" };
6945 
6946  }
6947 
6948 
6954  private static bool AddonGrupoOrigen(string tcAddon)
6955  {
6956  // Si en el diccionario ya existe el addon, devolvemos su valor
6957  if (_oAddonsOrigen.ContainsKey(tcAddon))
6958  return _oAddonsOrigen[tcAddon];
6959 
6960  switch (tcAddon.ToLower())
6961  {
6962  case "conceptosfacturables":
6963  DataTable ldtAuxiliar = new DataTable();
6964  DB.SQLExec("select valor from " + DB.SQLDatabaseReal(_DbComunesGrOrigen, "VARIABLE") + " " +
6965  "where variable = " + DB.SQLString("wl_ConceptosFacturables") + "", ref ldtAuxiliar);
6966 
6967  bool llActivo = ldtAuxiliar != null && ldtAuxiliar.Rows.Count == 1 && Convert.ToString(ldtAuxiliar.Rows[0]["valor"]).Trim().ToUpper() == ".T.";
6968  _oAddonsOrigen.Add(tcAddon, llActivo);
6969  return llActivo;
6970  }
6971 
6972  return false;
6973 
6974  }
6975 
6982  private static void ActivarOpcflag(string tcNombreBaseDatos, int tnOpcflag, bool tlValor)
6983  {
6984  DataTable ldtAuxiliar = new DataTable();
6985  String lcSql = string.Empty;
6986 
6987  // Buscamos el opcemp en el grupo destino, si no existe el registro lo creamos, sino lo updatamos, siempre con el valor del opcflag hallado en el grupo origen.
6988  DB.SQLExec("select empresa from " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " " +
6989  "where empresa=" + DB.SQLString(_EmpresaGrNuevo) + " and tipo_opc="+tnOpcflag+"", ref ldtAuxiliar);
6990  if (ldtAuxiliar.Rows.Count == 0)
6991  {
6992  DB.SQLExec("INSERT INTO " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " (EMPRESA,TIPO_OPC,ESTADO) " +
6993  "VALUES (" + DB.SQLString(_EmpresaGrNuevo) + ", "+ tnOpcflag+", " + (tlValor ? DB.SQLTrue() : DB.SQLFalse()) + ")");
6994  }
6995  else
6996  {
6997 
6998  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcNombreBaseDatos, "OPCEMP") + " " +
6999  "SET ESTADO = " + (tlValor ? DB.SQLTrue() : DB.SQLFalse()) + " " +
7000  "WHERE EMPRESA = " + DB.SQLString(_EmpresaGrNuevo) + " AND TIPO_OPC=" + tnOpcflag + "";
7001  DB.SQLExec(lcSql);
7002  }
7003 
7004  }
7005 
7011  private static string ObtenerTarifaDefecto(string tcTarifaDef)
7012  {
7013  DataTable ldTarifas = new DataTable();
7014  DB.SQLExec("select * from " + DB.SQLDatabase("GESTION", "TARIFAS") + " order by codigo", ref ldTarifas);
7015  if (ldTarifas != null && ldTarifas.Rows.Count > 0)
7016  {
7017  int lnTarifas = ldTarifas.Select("codigo = '" + tcTarifaDef + "'").Length;
7018  if (lnTarifas == 0)
7019  tcTarifaDef = Convert.ToString(ldTarifas.Rows[0]["codigo"]);
7020  }
7021 
7022  return tcTarifaDef;
7023  }
7024 
7025  #endregion METODOS PRIVADOS
7026 
7027 
7028 
7029  // CONSULTAR LAS CONSTRAINTS DE VALORES POR DEFECTOS DE TODAS LAS TABLAS
7030  // use [2017VO];
7031  // SELECT
7032  // TableName = t.Name,
7033  // ColumnName = c.Name,
7034  // dc.Name,
7035  // dc.definition
7036  // FROM sys.tables t
7037  // INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id
7038  // INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id
7039  // ORDER BY t.Name
7040 
7041 
7042 
7043  // AVERIGUAR LOS INDICES DE LAS TABLAS DE UNA BASE DE DATOS, INDICE PRIMARIO Y RESTO DE INDICES (SIN LOS CAMPOS QUE LOS COMPONEN)
7044  //
7045  //
7046  // SELECT schema_name(t.schema_id), t.name as nombre_tabla, i.name as nombre_indice, i.type_desc as tipo_indice, i.is_primary_key as indice_primario
7047  // FROM [2007NA].sys.indexes i
7048  // INNER JOIN [2007NA].sys.tables t ON t.object_id= i.object_id
7049  // WHERE i.type>0 and t.is_ms_shipped=0 order by t.name
7050 
7051 
7052 
7053 
7054  // OBTENER TODOS LOS INDICES (PRIMARIO Y RESTO DE INDICES DE TODAS LAS TABLAS DE UNA BASE DE DATOS), TENEMOS LA COLUMNA IS_PRIMARY_KEY QUE INDICE SI EL INDICES ES PRIMARIO
7055  //
7056  //
7057  // USE [2016YR];
7058  //GO
7059  //SELECT
7060  // TableName = t.name,
7061  // IndexName = ind.name,
7062  // IndexId = ind.index_id,
7063  // ColumnId = ic.index_column_id,
7064  // ColumnName = col.name,
7065  // ind.*,
7066  // ic.*,
7067  // col.*
7068  //FROM
7069  // sys.indexes ind
7070  //INNER JOIN
7071  // sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id
7072  //INNER JOIN
7073  // sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
7074  //INNER JOIN
7075  // sys.tables t ON ind.object_id = t.object_id
7076  //ORDER BY
7077  // t.name, ind.is_primary_key desc, ind.name, ind.index_id, ic.index_column_id;
7078 
7079 
7080  // CONSULTAR LAS CONSTRAINTS DE VALORES POR DEFECTO
7081  //
7082  //
7083  // select * from [nombrebd].sys.default_constraints;
7084 
7085 
7086  // CONSULTAR LAS CONSTRAINTS DE CLAVE PRIMARIA
7087  //
7088  //
7089  // select * from [nombrebd].sys.key_constraints;
7090 
7091 
7092  // CONSULTAR LAS CONSTRAINTS DE VALORES POR DEFECTOS DE TODAS LAS TABLAS DE UNA BASE DE DATOS
7093  //
7094  //
7095  // use [2017VO];
7096  // SELECT
7097  // TableName = t.Name,
7098  // ColumnName = c.Name,
7099  // dc.Name,
7100  // dc.definition
7101  // FROM sys.tables t
7102  // INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id
7103  // INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id
7104  // ORDER BY t.Name
7105 
7106 
7107 
7108 
7109  // GENERAR LA CLAVE PRIMARIA, AUTOMATICAMENTE APARECERA TAMBIEN UN INDICE COMO ESTE
7110  //
7111  //
7112  // ALTER TABLE [2007NA].[dbo].[C_ALBVEN] ADD CONSTRAINT [pk__2006na__c_albven__empnumlet]
7113  // PRIMARY KEY CLUSTERED ( [EMPRESA] ASC, [NUMERO] ASC, [LETRA] ASC)
7114  // WITH ( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
7115  // ON [eurowind]
7116 
7117 
7118 
7119  // GENERAR EL RESTO DE INDICES QUE NO SON CLAVE PRIMARIA
7120  //
7121  //
7122  // CREATE NONCLUSTERED INDEX [empcli] ON [2007NA].[DBO].[C_ALBVEN]
7123  // ([EMPRESA] ASC, [CLIENTE] ASC, [NUMERO] ASC, [LETRA] ASC)
7124  // WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [eurowini]
7125 
7126 
7127 
7128  // GENERAR CONSTRAINT DE VALOR POR DEFECTO DE CAMPO
7129  // ALTER TABLE [2017VO].dbo].[c_comuni] ADD CONSTRAINT [df__2017vo__c_comuni__empresa] DEFAULT ("") FOR [EMPRESA]
7130 
7131  //
7132  // OJO QUE SI SE CREAN LAS TABLAS MEDIANTE SELECT * INTO [newbd].dboi.tabla from [actbd].dbo.tabla la crea en el gurpo de archivo PRIMARY y no en [eurowind], ver que trascendencia podria tener.
7133 
7134 
7135 
7136  }
7137 }