NETVFP.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Runtime.InteropServices;
5 using System.Windows.Forms;
6 using System.Diagnostics;
7 using System.Xml;
8 using System.IO;
9 using System.Drawing;
10 using System.Data;
11 using sage.ew.global;
12 using sage.ew.db;
13 using sage.ew.functions;
14 using sage.ew.ewbase; // Task 111215. Eliminar sage.ew.license
15 using System.Text.RegularExpressions;
16 using sage.ew.objetos;
17 using sage.ew.usuario;
19 using sage.ew.functions.Clases;
20 using sage.ew.interficies;
21 using Sage.ES.S50.Addons;
22 
23 namespace sage.ew.netvfp
24 {
28  public static class NETVFP
29  {
30  #region DLLimports
31 
37  [DllImport("user32.dll")]
38  public static extern IntPtr RegisterWindowMessageW([MarshalAs(UnmanagedType.LPTStr)]String lpString); // Pointer to a null-terminated string that specifies the message to be registered.
39 
48  [DllImport("user32.dll")]
49  public static extern int SendMessage(IntPtr hWnd, IntPtr Msg, int wParam, int lParam);
50 
59  [DllImport("user32.dll")]
60  public static extern int PostMessage(IntPtr hWnd, IntPtr Msg, int wParam, int lParam);
61 
70  [DllImport("user32.dll")]
71  public static extern sbyte GetMessage(out Message lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
72 
78  [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
79  public static extern ushort GlobalAddAtom(string lpString);
80 
86  [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
87  public static extern ushort GlobalDeleteAtom(ushort nAtom);
88 
96  [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
97  public static extern uint GlobalGetAtomName(ushort nAtom, char[] lpBuffer, int nSize);
98 
104  [DllImport("user32.dll")]
105  [return: MarshalAs(UnmanagedType.Bool)]
106  public static extern bool IsWindow(IntPtr hWnd);
107 
114  [DllImport("user32.dll")]
115  public static extern bool EnableWindow(IntPtr hwnd, Boolean bEnable);
116 
121  [DllImport("user32.dll")]
122  public static extern int GetForegroundWindow();
123 
131  [DllImport("user32.dll")]
132  public static extern int GetWindowText(int hWnd, StringBuilder text, int count);
133 
139  [DllImport("user32.dll")]
140  public static extern IntPtr GetTopWindow(IntPtr hWnd);
141 
149  [DllImport("kernel32.dll")]
150  public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);
151 
157  [DllImport("kernel32.dll")]
158  public static extern bool ReleaseMutex(IntPtr hMutex);
159 
167  [DllImport("kernel32.dll")]
168  public static extern IntPtr OpenMutex(uint dwDesiredAccess, bool bInheritHandle, string lpName);
169 
175  [DllImport("kernel32.dll", SetLastError = true)]
176  [return: MarshalAs(UnmanagedType.Bool)]
177  static extern bool CloseHandle(IntPtr hObject);
178  // FI PE-80275
179 
180  // PE-93758
187  [DllImport("User32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
188  public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
189 
197  [DllImport("user32.dll")]
198  public static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);
199 
205  [DllImport("user32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
206  public static extern IntPtr SetFocus(IntPtr hwnd);
207 
214  [DllImport("user32.dll")]
215  public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
216 
223  [DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
224  public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
225 
226  // <summary>
227  // Mostrar una ventana
228  // </summary>
229  // <param name="hwnd"></param>
230  // <param name="nCmdShow"></param>
231  // <returns></returns>
232  // [DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
233  // public static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
234 
235  [DllImport("user32.dll")]
236  private static extern int ShowWindow(IntPtr hWnd, uint Msg);
237 
249  [DllImport("user32.dll")]
250  [return: MarshalAs(UnmanagedType.Bool)]
251  public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
252  // FI PE-93758
253 
254  [DllImport("User32.dll")]
255  private static extern IntPtr GetParent(IntPtr hWnd);
256 
263  [DllImport("user32.dll", SetLastError = true)]
264  static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
265 
266  #endregion DLLimports
267 
268 
269  #region CONSTANTES
270 
274  public const char SEPARADOR = '|';
275 
276  private const string EWVFP_NOTIFICATION = "SAGE_EW_VFP_NET";
277  private const string EWNET_NOTIFICATION = "SAGE_EW_NET_VFP";
278  private const string SAGE50_NOTIFICATION = "SAGE50_NOTIFICATION"; // PE-93758
279  private const string SAGE50_NOTIFICATION2 = "SAGE50_NOTIFICATION2"; // PE-93758
280  private const string SAGE50_NOTIFICATION3 = "SAGE50_NOTIFICATION3"; // PE-100744
281  private const string SAGE50_NOTIFICATION4 = "SAGE50_NOTIFICATION4"; // PE-100744
282  private const string SAGE50_NOTIFICATION5 = "SAGE50_NOTIFICATION5"; // PE-100744
283 
284  private const int MINIMO_PARAMETROS = 4;
285  private const int RESPONDER_INDEX = 0;
286  private const int OPCION_INDEX = 1;
287  private const int TIPO_INDEX = 2;
288  private const int VALOR_INDEX = 3;
289 
290  private const int WM_SETREDRAW = 11;
291 
292  private const uint SW_MAXIMIZE = 0x03;
293  private const uint SW_MINIMIZE = 0x06;
294  private const uint SW_RESTORE = 0x09;
295 
296  #endregion CONSTANTES
297 
298 
299  #region PROPIEDADES
300 
301 
305  //public static DataTable _dtOpenAllForms = new DataTable();
306 
307 
308  // PE-105604
312  public static bool _lNoComInterrupt = false;
313 
317  public static bool _plRespuesta = false;
318 
322  public static Dictionary<string, object> _Parametros;
323 
324  // Identificadores de los mensajes de comunicación
325  private static IntPtr msgewvfp_Notification = IntPtr.Zero;
326  private static IntPtr msgewnet_Notification = IntPtr.Zero;
327  private static IntPtr msgSage50_Notification = IntPtr.Zero; // CANAL NIVEL 1 (PE-93758)
328  private static IntPtr msgSage50_Notification2 = IntPtr.Zero; // CANAL NIVEL 2 (PE-93758)
329  private static IntPtr msgSage50_Notification3 = IntPtr.Zero; // CANAL NIVEL 3 (PE-100744)
330  private static IntPtr msgSage50_Notification4 = IntPtr.Zero; // CANAL NIVEL 4 (PE-100744)
331  private static IntPtr msgSage50_Notification5 = IntPtr.Zero; // CANAL NIVEL 5 (PE-100744)
332 
333  // Propiedad para guardar el indicador del mutex de control de .net (PE-80275)
334  private static IntPtr _nhMutexNet = IntPtr.Zero;
335 
336  // Nos servirá para averiguar el canal de comunicaciones entre FOX y NET (PE-93758, 100744)
337  private static int _Canales = 0;
338 
342  private static readonly string _cNameProd = Convert.ToString(EW_GLOBAL._GetVariable("wc_nameproducto"));
343 
348  private static bool _lCerrarFormulariosEWCanal2 = false;
349  #endregion PROPIEDADES
350 
351 
352  // Constructor estático
353  static NETVFP()
354  {
355  try
356  {
357  // Registrar los mensajes de comunicacion entre VFP y NET
358  RegisterWindowMessages();
359 
360  // Inicializo el diccionario de parámetros
361  // Estructura/ejemplo de los parámetros obligatorios
362  //_Parametros["responder"] = false; -> Indica si hay que enviar/recibir respuesta
363  //_Parametros["opcion"] = "albatpv"; -> Opción general a la que queremos acceder
364  //_Parametros["tipo"] = "valor"; -> Valores fijos (xml o valor).
365  //_Parametros["valor"] = ""; -> Si xml -> Ruta fichero, sino valores de parámetro/parámetros separados por el separador
366  _Parametros = new Dictionary<string, object>();
367 
368  // PE-103085. Inicializar el cursor donde guardaremos la referencia y hora de las formularios abiertos
369  //_dtOpenAllForms.Columns.Add("handle", typeof(IntPtr));
370  //_dtOpenAllForms.Columns.Add("hora", typeof(DateTime));
371  //_dtOpenAllForms.Columns.Add("tipo", typeof(string));
372  //_dtOpenAllForms.PrimaryKey = new DataColumn[] { _dtOpenAllForms.Columns["handle"] };
373  }
374  catch (Exception lo)
375  {
376  MessageBox.Show(lo.Message);
377  }
378  }
379 
380 
381  #region METODOS PUBLICOS
382  public static bool _SendMessageToVfp()
387  {
388  bool llSage50 = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")); // PE-100744
389  bool llOk = false;
390  string lcMensaje = string.Empty;
391 
392  // Antes de enviar un mensaje, forzar a terminar la espera de respuestas por si aún existe alguna activa.
393  _plRespuesta = false;
394 
395  DB.Registrar_Traza("_SendMessageToVfp - Inicio");
396 
397  // Comprobamos que exista el receptor del mensaje
398  if (!IsWindow((IntPtr)EW_GLOBAL._nHandleVfp))
399  return false;
400 
401  DB.Registrar_Traza("_SendMessageToVfp - Handle FOX OK");
402 
403  if (_Parametros == null || (_Parametros != null && _Parametros.Count <= 0))
404  return false;
405 
406  DB.Registrar_Traza("_SendMessageToVfp - Parameters OK");
407 
408  // Comprobamos si hay que esperar una respuesta
409  _plRespuesta = Convert.ToBoolean(_Parametros["responder"]);
410 
411  // Preparamos la cadena a enviar como mensaje a VFP
412  foreach (KeyValuePair<string, object> loClave in _Parametros)
413  {
414  if (!string.IsNullOrEmpty(lcMensaje))
415  lcMensaje = lcMensaje + SEPARADOR;
416 
417  lcMensaje = lcMensaje + loClave.Value.ToString().Trim();
418  }
419 
420  DB.Registrar_Traza("_SendMessageToVfp - Mensaje= "+ lcMensaje);
421 
422  try
423  {
424  // PE-93758. Tratar los distintos canales de comunicación en sage50. Al tener un sólo un ejecutable de .net, hay que tener un canal distinto para cada nivel. De momento permitimos dos.
425  // Enviar mensaje a VFP
426  if (llSage50)
427  {
428  IntPtr intPtrCanal = IntPtr.Zero;
429 
430  // Bug 153118. Forzar un sólo canal
431  _Canales = _lCerrarFormulariosEWCanal2 ? 2 : 1; // Al cerrar la aplicación si tenemos pantallas de FOX vamos a cerrar por el Canal 2
432 
433  DB.Registrar_Traza("_SendMessageToVfp - Canal " + _Canales.ToString());
434 
435  switch (_Canales)
436  {
437  case 1:
438  intPtrCanal = msgSage50_Notification;
439  break;
440 
441  case 2:
442  intPtrCanal = msgSage50_Notification2;
443  break;
444 
445  case 3:
446  intPtrCanal = msgSage50_Notification3;
447  break;
448 
449  case 4:
450  intPtrCanal = msgSage50_Notification4;
451  break;
452 
453  case 5:
454  intPtrCanal = msgSage50_Notification5;
455  break;
456 
457  default:
458  intPtrCanal = msgSage50_Notification;
459  break;
460  }
461 
462  llOk = (PostMessage((IntPtr)EW_GLOBAL._nHandleVfp, intPtrCanal, GlobalAddAtom(lcMensaje), lcMensaje.Length) != -1);
463  // FI PE-100744
464  }
465  else
466  llOk = (PostMessage((IntPtr)EW_GLOBAL._nHandleVfp, msgewvfp_Notification, GlobalAddAtom(lcMensaje), lcMensaje.Length) != -1);
467  // FI PE-93758
468 
469  if (llOk)
470  {
471  // En caso necesario, obtenemos mensaje de respuesta de VFP
472  if (_plRespuesta)
473  {
474  DB.Registrar_Traza("_SendMessageToVfp - Inicio espera respuesta");
475 
476  // Bucle infinito hasta recibir respuesta
477  while (_plRespuesta)
478  {
479  Application.DoEvents();
480  }
481 
482  DB.Registrar_Traza("_SendMessageToVfp - Fin espera respuesta");
483  }
484  }
485  }
486  catch (Exception loEx)
487  {
488  MessageBox.Show(loEx.Message);
489  System.Diagnostics.Debug.WriteLine("Error en SendEventToHostWindow: " + loEx.Message);
490  llOk = false;
491  }
492 
493  return llOk;
494  }
495 
502  public static bool _ReceiveMessageFromVfpPasswordInforautFOX(string tcEmpresa,string tcFichero)
503  {
504  FUNCTIONS._PasswordInforaut(tcEmpresa, tcFichero);
505  return true;
506  }
507 
513  public static bool _ReceiveMessageFromVfp(ref Message msgVfp)
514  {
515  bool llOk = false;
516 
517 
518  if (((IntPtr)msgVfp.Msg == msgewvfp_Notification) || ((IntPtr)msgVfp.Msg == msgewnet_Notification) || ((IntPtr)msgVfp.Msg == msgSage50_Notification) || ((IntPtr)msgVfp.Msg == msgSage50_Notification2) ||
519  ((IntPtr)msgVfp.Msg == msgSage50_Notification3) || ((IntPtr)msgVfp.Msg == msgSage50_Notification4) || ((IntPtr)msgVfp.Msg == msgSage50_Notification5)) // PE-93758, 100744
520  {
521 
522  try
523  {
524  DB.Registrar_Traza("_ReceiveMessageFromVfp - Inicio");
525 
526  // Obtener los parámetros a partir del mensaje recibido de VFP y cargarlos en el diccionario
527  string lcCadena = ObtenerCadenaMensaje(msgVfp);
528  llOk = (_ObtenerParametros(lcCadena));
529 
530  // Asegurar que nos llegan parámetros
531  if (!llOk)
532  return true;
533 
534  // PE-106613. Optimización
535  string lcOpcion = Convert.ToString(_Parametros["opcion"]).ToLower().Trim();
536  string lcValor = Convert.ToString(_Parametros["valor"]).Trim();
537  string lcTipo = Convert.ToString(_Parametros["tipo"]).Trim();
538 
539 
540  DB.Registrar_Traza("_ReceiveMessageFromVfp - Opción: " + lcOpcion);
541  DB.Registrar_Traza("_ReceiveMessageFromVfp - Valor: " + lcValor);
542  DB.Registrar_Traza("_ReceiveMessageFromVfp - Tipo: " + lcTipo);
543 
544  // PE-105604
545  if (_lNoComInterrupt == false || (_lNoComInterrupt == true && llOk && lcOpcion != "resize"))
546  {
547  // En el caso de ser un mensaje de respuesta, finalizamos el bucle donde espera la respuesta (_SendMessageToVfp)
548  _plRespuesta = false;
549  }
550 
551 
552  #region MENSAJES SAGE50
553 
554  // **** MENSAJES SAGE50 (PE-93758) ****
555 
556 
557  // Mensaje para imprimir recibos. Task 133717
558  if (llOk && lcOpcion == "imprimirrecibos")
559  {
560  string lcXmlFile = "", lcEmpresa = "", lcFactura = "";
561  int lnEjercicio = 0, lnOrden = 0, lnImpagado = 0, lnPendiente = 0, lnTipoReport= 0;
562  DataTable ldtRecibos = new DataTable();
563 
564  // Fichero xml donde recibimos los recibos a imprimir
565  lcXmlFile = lcValor;
566 
567  // Obtener los valores para enviar el correo
568  FUNCTIONS._Xml2Datatable(lcXmlFile, ref ldtRecibos);
569  File.Delete(lcXmlFile);
570 
571  // Ir imprimiendo los recibos
572  foreach (DataRow loRecibo in ldtRecibos.Rows)
573  {
574  lcEmpresa = Convert.ToString(loRecibo["empresa"]).Trim();
575  lnEjercicio = Convert.ToInt16(loRecibo["periodo"]);
576  lcFactura = Convert.ToString(loRecibo["factura"]).Trim().PadLeft(10,' ');
577  lnOrden = Convert.ToInt16(loRecibo["orden"]);
578  lnImpagado = Convert.ToInt16(loRecibo["impagado"]);
579  lnPendiente = Convert.ToInt16(loRecibo["pendiente"]);
580  lnTipoReport = Convert.ToInt16(loRecibo["tiporep"]);
581 
582  FUNCTIONS._ImprimirRecibo(lcEmpresa,lnEjercicio,lcFactura,lnOrden,lnImpagado,lnPendiente,lnTipoReport);
583  }
584  }
585 
586  // Mensaje para crear una tarea programada (Task 106637)
587  if (llOk && lcOpcion == "tareaprog")
588  {
589  // Obtener datos enviados en el mensaje desde fox
590  string lcFormParam = lcValor; // Formulario y parámetros separados por @
591  string lcNombre = lcTipo; // Nombre para la tarea
592 
593  // Obtener el nombre del formulario a ejecutar, puede ser que lleve parámetros
594  string lcForm = lcFormParam;
595  if (lcForm.IndexOf('@') > 0)
596  {
597  string[] loPartes = lcForm.Split('@');
598  lcForm = loPartes[0];
599  }
600  // Comprobar acceso al formulario a ejecutar
601  Usuario loSageSystem = new Usuario("SAGESYSTEM", true);
602  loSageSystem._Load();
603  formul._TiposAccesosPantalla loTipoAcceso = loSageSystem._Acceso(lcForm, true);
604  if (loTipoAcceso != formul._TiposAccesosPantalla.Completo)
605  loSageSystem._Acceso_Pantalla(lcForm, formul._TiposAccesosPantalla.Completo, true, EW_GLOBAL._GetVariable("wc_empresa").ToString().Trim());
606 
607  // Parámetros tarea
608  string lcDescripcion = "Tarea programada de "+_cNameProd+" para el formulario " + lcForm;
609  string lcHora = "22:00";
610  List<bool> lstDias = new List<bool>() { true, true, true, true, true, false, false };
611 
612  // Creación tarea
613  Usuario._This._CrearTareaAutomatica(lcNombre, lcDescripcion, lcFormParam, lstDias, lcHora, null, false, loSageSystem);
614  }
615 
616  // Mensaje para abrir albarán de venta relacionado con un servicio (PE-102010)
617  if (llOk && lcOpcion == "albavenservicio")
618  {
619  string lcFormVfp = "ALBAVEN";
620  string[] laParamsVfp = { lcValor };
621  string lcFileReturn = lcTipo;
622 
623  FUNCTIONS._Obtener_Formulario_Net("","","", lcFormVfp, laParamsVfp, 0, false);
624 
625  GuardarFicheroXmlRespuesta(lcFileReturn, new string[] { "true" });
626  }
627 
628 
629  // Mensaje para comprobar la suscripción de un módulo en sage50 (PE-100885)
630  if (llOk && lcOpcion == "bajasuscripcion")
631  {
632  string lcModulo = lcValor;
633  string lcFileReturn = lcTipo;
634 
635  bool llBaja = LICENCIAS._BajaSuscripcion(lcModulo);
636 
637  GuardarFicheroXmlRespuesta(lcFileReturn, new string[] { llBaja.ToString().Trim().ToLower() });
638  }
639 
640  // Mensaje para comprobar la suscripción de un formulario en sage50 (PE-100885)
641  if (llOk && lcOpcion == "bajasuscripcionform")
642  {
643  string lcForm = lcValor;
644  string lcFileReturn = lcTipo;
645 
646  bool llBaja = LICENCIAS._BajaSuscripcionForm(lcForm);
647 
648  GuardarFicheroXmlRespuesta(lcFileReturn, new string[] { llBaja.ToString().Trim().ToLower() });
649  }
650 
651  // Mensaje de respuesta, aquí sólo lo utilizamos para decrementar los niveles de comunicación FOX-NET (PE-100744)
652  if (llOk && lcOpcion == "retorno")
653  {
654  try
655  {
656  if (EW_GLOBAL._OpenForms != null)
657  {
658  _Canales--;
659 
660  // PE-103236. En caso de cerrar un formulario de fox, si sólo queda abierto el frmPrincipal, refrescamos información de la tabla CONNECT tambien
661  if (EW_GLOBAL._OpenForms.Count == 1)
662  Usuario._This._Revisar_Connect_Formulario("frmPrincipal", "frmPrincipal");
663 
664  // Recuperar y mostrar el último formulario de net abierto antes de navegar a fox
665  if (EW_GLOBAL._OpenForms.Count > 0)
666  {
667  Form loForm = EW_GLOBAL._OpenForms.Peek();
668  if (loForm != null)
669  {
670  loForm.BringToFront();
671  loForm.Focus();
672  }
673  }
674  }
675  }
676  catch (Exception loEx)
677  {
678  DB.Registrar_Error(loEx);
679  }
680  }
681 
682  //PE-104237: Recepción de un mensaje de fox con un xml de clientes para calcular el riesgo
683  if (llOk && lcOpcion == "recalculoriesgo")
684  {
685  string lcClienteIni = lcTipo;
686  string lcClienteFin = lcValor;
687 
688  // PE-105581, solo se realiza el recalculo de credito si se hace servir Contacts en Overdrive, sino no
689  // debido a que en determinados procesos (factuven, factucuo, rem_banc.) al invocar a este metodo con forma de rango inicial-final podia darse el caso
690  // de que este rango fuese muy amplio y provocaba "cuelgue" aparente, p.e., hacemos facturacion general, acotamos todos los clientes pero luego en la pantalla
691  // de presentacion de albaranes marcados solamente 2 clientes, el 43.2 y el 43.40000, en este caso reacalcularia el riesgo de todos los clientes que hay en el rango.
692  // Idem en remesa bancaria, al crear remesa con 2 previsiones solamente, una del 43.2 y la segunda del 43.40000 pasaria lo mismo.
693  //
694  // Hasta que se programe la llamada hacia aqui transfiriendo un XML con los códigos de cliente a recalcular y no un rango inicial-final, como solución provisional se
695  // hace que solo se recalcule si se trabaja con Contacts
696  bool llContacts = Convert.ToBoolean(DB.SQLValor("empresa", "codigo", EW_GLOBAL._GetVariable("wc_empresa").ToString(), "CONTACT"));
697  bool _lEsCentralOffline = Convert.ToBoolean(EW_GLOBAL._ModuloActivo("OFFLINE")) && Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_TipoOffline"));
698 
699  if (llContacts || _lEsCentralOffline)
700  {
701  FUNCTIONS._RecalcularRiesgoDesdeFox(lcClienteIni, lcClienteFin);
702  }
703  }
704  //FI PE-104237
705 
706  // Mensaje para enviar un email directo desde sage50 (PE-99045)
707  if (llOk && lcOpcion == "emaildirecto")
708  {
709  string lcCampo = "",lcValorCampo="";
710  string lcEmail = "", lcFileReturn = "", lcAsunto = "", lcCuerpo = "", lcAdjunto = "";
711  bool llResp = true;
712  DataTable ldtCampos = new DataTable();
713 
714  // Fichero xml donde recibimos los valores para el email y que luego tambien utilizaremos para enviar la respuesta
715  lcFileReturn = lcValor;
716 
717  // Obtener los valores para enviar el correo
718  FUNCTIONS._Xml2Datatable(lcFileReturn, ref ldtCampos);
719  File.Delete(lcFileReturn);
720 
721  try
722  {
723  foreach (DataRow loCampo in ldtCampos.Rows)
724  {
725  lcCampo = Convert.ToString(loCampo["campo"]).Trim().ToLower();
726  lcValorCampo = Convert.ToString(loCampo["valor"]).Trim();
727 
728  switch (lcCampo)
729  {
730  case "destino":
731  lcEmail = lcValorCampo;
732  break;
733 
734  case "asunto":
735  lcAsunto = lcValorCampo;
736  break;
737 
738  case "cuerpo":
739  lcCuerpo = lcValorCampo;
740  break;
741 
742  case "adjunto":
743  lcAdjunto = lcValorCampo;
744  break;
745 
746  default:
747  break;
748  }
749  }
750 
751  //PE-101222: Obtenemos de la variable global tempCliente<usuario> si hay un valor significa que lo hemos establecido antes de llamar
752  //a FOX para poder tener el valor al enviarlo al envio directo del email y el log correspondiente. Lo mismo con proveedor
753  object loCliente = EW_GLOBAL._GetVariable("tmpCliente" + Convert.ToString(EW_GLOBAL._GetVariable("wc_usuario")));
754  string lcCliente = string.Empty;
755  if (loCliente != null && !string.IsNullOrWhiteSpace(Convert.ToString(loCliente)))
756  {
757  lcCliente = Convert.ToString(loCliente);
758  EW_GLOBAL._SetVariable("tmpCliente" + Convert.ToString(EW_GLOBAL._GetVariable("wc_usuario")), "");
759  }
760 
761  object loProveed = EW_GLOBAL._GetVariable("tmpProveed" + Convert.ToString(EW_GLOBAL._GetVariable("wc_usuario")));
762  string lcProveed = string.Empty;
763  if (loProveed != null && !string.IsNullOrWhiteSpace(Convert.ToString(loProveed)))
764  {
765  lcProveed = Convert.ToString(loProveed);
766  EW_GLOBAL._SetVariable("tmpProveed" + Convert.ToString(EW_GLOBAL._GetVariable("wc_usuario")), "");
767  }
768 
769  // Enviar correo directo
770  string lcError = "";
771  llResp = FUNCTIONS._Send_Direct_Email(lcEmail, lcAsunto, lcCuerpo, ref lcError, lcAdjunto, lcCliente, lcProveed);
772  if (!llResp)
773  FUNCTIONS._MessageBox(lcError, "Envío de correo directo", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
774  }
775  catch (Exception loEx)
776  {
777  MessageBox.Show(loEx.Message + Environment.NewLine + Environment.NewLine + loEx.InnerException, "Envío de correo directo", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
778  llResp = false;
779  }
780 
781  // Crear xml con la respuesta para fox
782  GuardarFicheroXmlRespuesta(lcFileReturn, new string[] { llResp.ToString().Trim().ToLower() });
783  }
784 
785  // Mensaje para ejecutar una acción de la comunidad de sage50 (PE-97516)
786  if (llOk && lcOpcion == "comunidad50")
787  {
788  string lcOperacion = lcTipo;
789  string lcParametros = lcValor;
790 
791  FUNCTIONS._Comunidad50_Ejecutar_Operacion(lcOperacion, lcParametros);
792  }
793 
794 
795  // Mensaje para crear un acceso directe a sage50 (PE-95913)
796  if (llOk && lcOpcion == "appshortcut")
797  {
798  string lcCaption = lcTipo;
799  string lcName = lcValor;
800 
801  FUNCTIONS._CrearAccesoDirecto(lcCaption, lcName);
802  }
803 
804  // Mensaje para crear un nuevo apunte en calendario (PE-97078)
805  if (llOk && lcOpcion == "newcalendarnote")
806  {
807  // En 'tipo' desde FOX hemos pasado el nombre de la pantalla según COMUNES!CALENDAR (el nombre del formulario de FOX sin el .SCX, vaya)
808  string lcPantalla = lcTipo;
809 
810  // En 'valor' desde FOX hemos pasado los valores que identifican al documento que se tiene en pantalla (según campo PROPIEDAD del registro
811  // de COMUNES.CALENDAR correspondiente a la pantalla que solicita crear el apunte de calendario)
812  string lcParametrosDocFox = lcValor;
813 
814  // Pasamos los valores en formato array de strings.
815  string[] laValoresPropiedades = lcParametrosDocFox.Split('@');
816  FUNCTIONS._CrearNuevoApunteCalendario(laValoresPropiedades, lcPantalla);
817  }
818 
819 
820  // Mensaje para redimensionar formulario principal de sage50 (PE-95668)
821  if (llOk && lcOpcion == "resize")
822  {
823  if (Application.OpenForms.Count > 0)
824  {
825  Form loForm = Application.OpenForms["frmPrincipal"];
826  if (loForm != null)
827  {
828  int lnHeight = Convert.ToInt32(lcTipo);
829  int lnWidth = Convert.ToInt32(lcValor);
830 
831  loForm.Size = new Size(lnWidth,lnHeight);
832 
833  //PE-98258: Al hacer un resize de Sage50 en la integración de FOX, se pierde el refresco de los objetos del top (menú usuario, imagen, etc.)
834  //Forzamos un Refresh() del formulario al hacer un resize y funciona correctamente
835  loForm.Refresh();
836  }
837  }
838  }
839 
840  // PARTE 99728. Mensaje para controlar si podemo cerrar sage50
841  if (llOk && lcOpcion == "podemos_cerrar_net")
842  {
843  if (Application.OpenForms.Count > 0)
844  {
845  dynamic loForm = Application.OpenForms["frmPrincipal"]; // PARTE 99728
846  if (loForm != null)
847  {
848  // Si tenemos el diseñador de Sage 50 en modo de edición no podemos cerrar la aplicación
849  if (!loForm._CanClose(true)) // PARTE 101086. Avisamos si debe de cerrar la pantalla
850  {
851  string lcFichero = lcValor;
852 
853  // Generamos el fichero
854  StreamWriter swCargar_Perfil = new StreamWriter(lcFichero);
855  swCargar_Perfil.Write(loForm.Text); // Pasamos el id del handle por si deseamos realizar algun control
856  swCargar_Perfil.Close();
857 
858  return false;
859  }
860  }
861  }
862 
863  return true;
864  }
865  // FPARTE 99728. Mensaje para controlar si podemo cerrar sage50
866 
867  if (llOk && lcOpcion == "passwordinforaut")
868  {
869  _ReceiveMessageFromVfpPasswordInforautFOX(Convert.ToString(lcTipo), Convert.ToString(lcValor));
870  return true;
871  }
872 
873  // Mensaje para cerrar sage50
874  if (llOk && lcOpcion == "cerrar")
875  {
876  if (Application.OpenForms.Count > 0)
877  {
878  dynamic loForm = Application.OpenForms["frmPrincipal"]; // PARTE 99728
879  if (loForm != null)
880  {
881  // PARTE 99728: Si tenemos el diseñador de Sage 50 en modo de edición no podemos cerrar la aplicación
882  if (!loForm._CanClose())
883  return false;
884 
885  NETVFP.SetParent(loForm.Handle, IntPtr.Zero);
886  loForm.Close();
887  }
888  }
889  }
890 
891  // Mensaje para ejecutar una opción de .net (SAGE50)
892  if (llOk && lcOpcion == "ejecutar")
893  {
894  dynamic loForm = null;
895 
896  // Obtener parámetros del mensaje
897  string[] laForms = lcTipo.Split('@');
898  string[] laParamsVfp = lcValor.Split('@');
899 
900  // Obtener la librería y el formario a ejectuar
901  string lcLibreriaNet = "";
902  string lcFormNet = laForms[0].ToString().Trim();
903  string lcFormVfp = laForms[1].ToString().Trim().ToLower();
904  long lnHandleVfp = Convert.ToInt32(laForms[2]);
905 
906  int lnPos = lcFormNet.IndexOf('.', lcFormNet.IndexOf('.', lcFormNet.IndexOf('.') + 1) + 1);
907  if (lnPos > 0)
908  lcLibreriaNet = lcFormNet.Substring(0, lnPos);
909 
910  // Obtener formulario de net a mostrar
911  loForm = FUNCTIONS._Obtener_Formulario_Net(lcLibreriaNet, lcFormNet, "", lcFormVfp, laParamsVfp, lnHandleVfp);
912 
913  if (loForm != null)
914  {
915  // Importante mostrar el formulario mediante SHOW(), ya que con sólo un ejecutable de .net, en sage50 al hacer un SHOWDIALOG() la parte de fox se queda colgada esperando...
916  loForm._Show();
917  }
918  }
919  // **** FIN MENSAJES SAGE50 (PE-93758) ****
920 
921  #endregion MENSAJES SAGE50
922 
923 
924  // PE-85461
925  // Capturamos el nuevo handle de la ventana de fox
926  if (llOk && lcOpcion == "newhandlevfp")
927  {
928  EW_GLOBAL._nHandleVfp = Convert.ToInt32(lcValor);
929  }
930 
931  // PE-88929. Mensaje especial para pasar el foco al txtNumero
932  if (llOk && lcOpcion == "foco")
933  {
934  if (Application.OpenForms.Count > 0) // PARTE 93552. Certificamos que tengamos una colección de formularios activa
935  {
936  dynamic loForm = Application.OpenForms[0];
937  if (loForm != null)
938  {
939  dynamic[] loControls = loForm.Controls.Find("txtNumDocVen", true);
940  if (loControls.Length > 0)
941  {
942  loControls[0]._Pasar_Foco_Numero();
943  }
944  }
945  }
946  }
947  // FI PE-88929
948 
949  // Capturamos la carga incial de un documento teniendo el exe ya abierto
950  if (llOk && lcTipo.ToLower().Trim() == "carga_con_exe_abierto" && (lcOpcion == "albatpv" || lcOpcion == "albaven")) // 89286
951  {
952  if (lcValor.Contains("\\"))
953  {
954  object[] laParams = lcValor.Split('\\');
955 
956  if (Application.OpenForms.Count > 0) // PARTE 93552. Certificamos que tengamos una colección de formularios activa
957  {
958  dynamic loForm = Application.OpenForms[0];
959  loForm._Init(laParams);
960  }
961  }
962  }
963  // FI PE-85461
964 
965  // PARTE 93552 - PARTE 93937
966  if (llOk)
967  {
968  string lcTipoOp = (lcTipo.ToLower().Trim());
969 
970  // escalar_perfil ---> Escalamos el perfil a partir del Resize
971  // integrar_vfp_net_ini y integrar_vfp_net_fin ---> para controlar cuando estamos integrando desde .NET que no se dispare el RESIZE del formulario de .NET hasta que nos interese
972  if (lcTipoOp == "escalar_perfil" || lcTipoOp == "integrar_vfp_net_ini" || lcTipoOp == "integrar_vfp_net_fin")
973  {
974  if (lcValor.Contains("#")) // Certificamos que nos llegan los parámetros
975  {
976  object[] laParams = lcValor.Split('#');
977 
978  // Controlamos que nos llega como mínimo los parámetros esperados
979  if (laParams != null && laParams.Length >= 3)
980  {
981  // Miramos que tengamos una colección de formularios activa
982  if (Application.OpenForms.Count > 0)
983  {
984  dynamic loForm = Application.OpenForms[0];
985 
986  // Vamos a escalar la pantalla de .NET
987  loForm._Escalar_Perfil_Desde_VFP(laParams);
988  }
989  }
990  }
991  }
992  }
993  // FPARTE 93552 - FPARTE 93937
994 
995 
996  // PE-102057, impresión masiva de facturas o albaranes en .NET con el report de .NET, llamada desde FACTUVEN.SCX de FOX, REPEFAC.SCX, IMPALBS.SCX
997  if (llOk && lcOpcion == "printmassivedocument")
998  {
999  string lcFileXml = lcValor;
1000  string lcTypePrint = lcTipo.ToLower().Trim(); // Aqui puede llegar "invoices" o "deliverynotes"
1001 
1002  eTiposDocumentoImpresionMasiva leTipoDocumentoImpresionMasiva = eTiposDocumentoImpresionMasiva.FacturasVenta;
1003 
1004  switch (lcTypePrint)
1005  {
1006  case "invoices":
1007  leTipoDocumentoImpresionMasiva = eTiposDocumentoImpresionMasiva.FacturasVenta;
1008  break;
1009  case "deliverynotes":
1010  leTipoDocumentoImpresionMasiva = eTiposDocumentoImpresionMasiva.AlbaranesVenta;
1011  break;
1012  }
1013 
1014  // PARTE 103904. Marcamos que se está realizando el envio masivo desde FOX.
1015  // Es necesario realizar el envío directamente en .net, en el caso de estar activada la opción de ENVIO DIRECTO
1016  EW_GLOBAL.ValorEnClave_VarGlob("wl_printmassivedocument", true);
1017 
1018  sage.ew.functions.FUNCTIONS._Print_Document_Massive(leTipoDocumentoImpresionMasiva, lcFileXml);
1019 
1020  EW_GLOBAL.ValorEnClave_VarGlob("wl_printmassivedocument", false);
1021  // FPARTE 103904
1022  }
1023 
1024  // PE-103206, impresión de montaje
1025  if (llOk && lcOpcion == "printdocument")
1026  {
1027 
1028  string lcTypePrint = lcTipo.ToLower().Trim(); // Aqui puede llegar "montaje" de momento
1029  string lcParametros = lcValor; // Caso de montajes llega codigomontaje|1 o codigomontaje|0 segun si se han de imprimir costes o no
1030  switch (lcTypePrint)
1031  {
1032  case "montaje":
1033  if (!string.IsNullOrWhiteSpace(lcParametros))
1034  sage.ew.functions.FUNCTIONS._Print_Document("montaje", lcParametros);
1035  break;
1036 
1037  case "pedicom": // CCRequest 107065
1038  if (!string.IsNullOrWhiteSpace(lcParametros))
1039  sage.ew.functions.FUNCTIONS._Print_Document("pedicom", lcParametros);
1040  break;
1041 
1042  }
1043 
1044  }
1045 
1046  // PE-95303. Mostrar el browser de .Net
1047  if (llOk && lcOpcion == "shownetbrowser")
1048  {
1049  sage.ew.functions.FUNCTIONS._Show_Browser_For_Fox(lcValor);
1050  }
1051 
1052  // PE-103169. Mostrar el resultado del Ven_Ca de Fox en Google Maps de .Net
1053  if (llOk && lcOpcion == "showgooglemaps")
1054  {
1055  functions.FUNCTIONS._Show_GoogleMaps_From_VencaFox(lcValor);
1056  }
1057 
1058  // PARTE 98022
1059  if (llOk && lcOpcion == "shownetfavoritos")
1060  {
1061  object[] laParams = lcValor.Split('#');
1062 
1063  // Controlamos que nos llega como mínimo los parámetros esperados
1064  if (laParams != null && laParams.Length >= 2)
1065  Usuario._This._Show_Favoritos(Convert.ToString(laParams[0]), Convert.ToString(laParams[1]));
1066  }
1067  // FPARTE 98022
1068 
1069  // PARTE 100996
1070  if (llOk && lcOpcion == "shownetaccesos")
1071  {
1072  object[] laParams = lcValor.Split('#');
1073 
1074  // Controlamos que nos llega como mínimo los parámetros esperados
1075  if (laParams != null && laParams.Length >= 2)
1076  Usuario._This._Show_Gestion_Accesos(Convert.ToString(laParams[0]), Convert.ToString(laParams[1]));
1077  }
1078  // FPARTE 100996
1079 
1080  // PARTE 104973. Al realizar los asientos de cierre y de regularización en la pantalla AS_CIERR.SCX luego no detecta que los meses estan cerrados
1081  if (llOk && lcOpcion == "cleanmesescerrados")
1082  EW_GLOBAL.ValorEnClave_VarGlob("wo_meses", null);
1083 
1084  // PARTE 97053
1085  if (llOk)
1086  {
1087  string lcTipoOp = (lcTipo.ToLower().Trim());
1088 
1089  // truquem per skype
1090  if (lcTipoOp == "llamada_skype")
1091  {
1092  if (lcValor.Contains("#")) // Certificamos que nos llegan los parámetros
1093  {
1094  object[] laParams = lcValor.Split('#');
1095 
1096  // Controlamos que nos llega como mínimo los parámetros esperados
1097  if (laParams != null && laParams.Length >= 2)
1098  {
1099  // Miramos que tengamos una colección de formularios activa
1100  if (Application.OpenForms.Count > 0)
1101  {
1102  skype.SkypePlugin loSkype = skype.SkypePlugin.Instance;
1103  loSkype._Call(laParams[1].ToString().Trim());
1104  }
1105  }
1106  }
1107  }
1108  }
1109 
1110  //PE-97314
1111  if (llOk)
1112  {
1113  object[] laParams = null;
1114 
1115  // Si no encuentra el # genera el array laParams con un solo elemento en la posicion 0
1116  // si encuentra el # genera el array normalmente.
1117  laParams = lcValor.Split('#');
1118 
1119  switch(lcTipo)
1120  {
1121  //Abrimos el FileDialog en modo "selección carpetas"
1122  case "OneDrive_FolderDialog":
1123 
1124  if (laParams != null && laParams.Length >= 1)
1125  {
1126  IFileDialog365 loFileDialog = EW_GLOBAL._FileDialog365;
1127  llOk = loFileDialog._OpenAndSavePath(Convert.ToString(laParams[0]) , 0);
1128  }
1129  break;
1130  //Abrimos el FileDialog en modo "selección ficheros"
1131  case "OneDrive_FileDialog":
1132 
1133  if (laParams != null && laParams.Length >= 1)
1134  {
1135  IFileDialog365 loFileDialog = EW_GLOBAL._FileDialog365;
1136  llOk = loFileDialog._OpenAndSavePath(Convert.ToString(laParams[0]), 1);
1137  }
1138 
1139  break;
1140 
1141  case "OneDrive_Upload":
1142 
1143  if (laParams != null && laParams.Length >= 2)
1144  {
1145  IFileDialog365 loFileDialog = EW_GLOBAL._FileDialog365;
1146  llOk = loFileDialog._UploadFile(Convert.ToString(laParams[0]), Convert.ToString(laParams[1]));
1147  }
1148  break;
1149  }
1150  }
1151  //FIN PE-97314
1152 
1153  // 100587
1154  if (llOk)
1155  {
1156  string lcTipoOp = (lcTipo.ToLower().Trim());
1157 
1158  // Volem forçar un recalcul d'stock després de rebre dades del OFFLINE
1159  if (lcTipoOp == "offline_recstock")
1160  {
1161  stocks.Recalculo_Stocks loRecalcul = new stocks.Recalculo_Stocks();
1162  loRecalcul._Recalcular_Stocks();
1163  }
1164  }
1165  // fi 100587
1166 
1167  // S50MIG-2623
1168  if (llOk && lcOpcion.ToLower().Trim() == "enviarusopantalla" && !string.IsNullOrWhiteSpace(lcValor))
1169  {
1170  FUNCTIONS._EnviarDatosUsoPantalla(lcValor, lcTipo);
1171  }
1172  // FS50MIG-2623
1173 
1174  }
1175  catch (Exception loEx)
1176  {
1177  MessageBox.Show(loEx.Message);
1178  llOk = false;
1179  }
1180  finally
1181  {
1182  EliminarMensaje(ref msgVfp);
1183  }
1184  }
1185 
1186  return llOk;
1187  }
1188 
1194  public static bool _ObtenerParametros(string tcParametros)
1195  {
1196  // Ponemos los parámetros en un array
1197  string[] lcParametros = tcParametros.Split(SEPARADOR);
1198 
1199  // Si no llegan los mínimos parámetros obligatorios, salimos
1200  if (lcParametros.Length < MINIMO_PARAMETROS)
1201  return false;
1202 
1203  // Obtenemos los parámetros obligatorios
1204  _Parametros.Clear();
1205  _Parametros["responder"] = lcParametros[RESPONDER_INDEX];
1206  _Parametros["opcion"] = lcParametros[OPCION_INDEX];
1207  _Parametros["tipo"] = lcParametros[TIPO_INDEX];
1208  _Parametros["valor"] = lcParametros[VALOR_INDEX];
1209 
1210  // Obtenemos el resto de parámetros opcionales
1211  int i = 0;
1212  for (int lnPar = 4; lnPar < lcParametros.Length; lnPar++)
1213  {
1214  i++;
1215  _Parametros["paradi" + i.ToString().Trim()] = lcParametros[lnPar];
1216  }
1217 
1218  // Disparamos la carga inicial
1219  if (_Parametros["opcion"].ToString().ToLower().Trim() == "inicial")
1220  CargaInicial(_Parametros["valor"].ToString());
1221 
1222 
1223  return true;
1224  }
1225 
1232  public static string _Abrir_Formulario_VFP(string tcFormulario, object[] toParametros = null)
1233  {
1234  return Ejecutar_VFP("crear", tcFormulario, toParametros, true);
1235  }
1236 
1244  public static string _Abrir_Formulario_VFP(string tcFormulario, object[] toParametros, bool tlRespuesta=true)
1245  {
1246  return Ejecutar_VFP("crear", tcFormulario, toParametros, tlRespuesta);
1247  }
1248 
1256  public static string _Abrir_Formulario_VFP(string tcFormulario, object[] toParametros, Form toForm)
1257  {
1258  string lcRetorn = "";
1259 
1260  // En modo sage50 no es necesario (PE-93758)
1261  if (!Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")))
1262  {
1263  EnableWindow((IntPtr)EW_GLOBAL._nHandleVfp, false);
1264  if (toForm != null)
1265  EnableWindow(toForm.Handle, false);
1266  }
1267 
1268  lcRetorn = Ejecutar_VFP("crear", tcFormulario, toParametros);
1269 
1270  // En modo sage50 no es necesario (PE-93758)
1271  if (!Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")))
1272  {
1273  if (toForm != null)
1274  EnableWindow(toForm.Handle, true);
1275  EnableWindow((IntPtr)EW_GLOBAL._nHandleVfp, true);
1276  }
1277 
1278  // PE-78759. Forzamos el foco al formulario para que el programa no se quede en el limbo
1279  if (toForm != null)
1280  {
1281  toForm.Focus();
1282  }
1283 
1284  return lcRetorn;
1285  }
1286 
1295  //PE-75517 Se añade un tercer parametro opcional para poder trabajar con funciones fox que esperen arrays como parámetros.
1296  public static string _Ejecutar_Funcion_VFP(string tcFuncion, object[] toParametros, bool tlArray, Form toForm)
1297  {
1298  string lcRetorn = "";
1299 
1300  if (toForm != null)
1301  EnableWindow(toForm.Handle, false);
1302  EnableWindow((IntPtr)EW_GLOBAL._nHandleVfp, false);
1303 
1304  if (tlArray)
1305  {
1306  string lcNombreXml = GenerarParametrosXml(tcFuncion, toParametros);
1307  lcRetorn = Ejecutar_VFP("funcion", "EJECUTARXML", new Object[] { lcNombreXml.ToString().Trim() });
1308  }
1309  else lcRetorn = Ejecutar_VFP("funcion", tcFuncion, toParametros);
1310 
1311  if (toForm != null)
1312  EnableWindow(toForm.Handle, true);
1313  EnableWindow((IntPtr)EW_GLOBAL._nHandleVfp, true);
1314 
1315  // PE-78759. Forzamos el foco al formulario para que el programa no se quede en el limbo
1316  if (toForm != null)
1317  {
1318  toForm.Focus();
1319  toForm.BringToFront();
1320  }
1321 
1322  return lcRetorn;
1323  }
1324 
1332  //PE-75517 Se añade un tercer parametro opcional para poder trabajar con funciones fox que esperen arrays como parámetros.
1333  public static string _Ejecutar_Funcion_VFP(string tcFuncion, object[] toParametros = null, bool tlArray = false)
1334  {
1335  if (tlArray)
1336  {
1337  string lcNombreXml = GenerarParametrosXml(tcFuncion, toParametros);
1338  return Ejecutar_VFP("funcion", "EJECUTARXML", new Object[] { lcNombreXml.ToString().Trim() });
1339  }
1340  else return Ejecutar_VFP("funcion", tcFuncion, toParametros);
1341  }
1342 
1351  public static string _Ejecutar_Funcion_VFP(string tcFuncion, object[] toParametros, bool tlArray, bool tlRespuesta=true)
1352  {
1353  if (tlArray)
1354  {
1355  string lcNombreXml = GenerarParametrosXml(tcFuncion, toParametros);
1356  return Ejecutar_VFP("funcion", "EJECUTARXML", new Object[] { lcNombreXml.ToString().Trim() }, tlRespuesta);
1357  }
1358  else return Ejecutar_VFP("funcion", tcFuncion, toParametros, tlRespuesta);
1359  }
1360 
1368  public static string _Ejecutar_Funcion_VFP_Menu50(string tcFuncion)
1369  {
1370  string lcFunction = string.Empty;
1371  object[] loParametros = new object[0];
1372  //Miren que ens arribi algo i tingui parentesis
1373  if (!string.IsNullOrWhiteSpace(tcFuncion) && tcFuncion.IndexOf("(") >= 0)
1374  {
1375  // PE-103996. Caso especial para controlar que no exista ningun formulario abierto antes de ejecutar temas de apertura.
1376  // TODO: Cuando se incorpore la apertura en .net revisar esta comprobación
1377  if (tcFuncion == "opcAperNuevo()" || tcFuncion == "opcAperTraspDoc")
1378  {
1379  if (!FUNCTIONS._ComprobarFormulariosAbiertos())
1380  {
1381  MessageBox.Show("Para realizar cualquier operación de apertura es necesario cerrar los formularios abiertos.", "Apertura", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
1382  return "";
1383  }
1384  }
1385  // FI PE-103996
1386 
1387  //Exp regular per recuperar el nom de la funció
1388  //PE-103318: incluir el . para que parsee el nombre de función cuando tiene un objeto más .funcion
1389  Match loMatchFunc = Regex.Match(tcFuncion, @"^\s*([\w\.]+)\s*\((.*)\)");
1390  if (!string.IsNullOrWhiteSpace(loMatchFunc.Value))
1391  {
1392  //Nom de la funció
1393  lcFunction = loMatchFunc.Groups[1].Value.ToString().Trim();
1394  if (!string.IsNullOrWhiteSpace(loMatchFunc.Groups[2].Value))
1395  {
1396  //Exp regular per recuperar els parametres de la funció
1397  MatchCollection loMatchParams = Regex.Matches(loMatchFunc.Groups[2].Value, @"([^,]+\(.+?\))|([^,]+)");
1398  if (loMatchParams.Count > 0)
1399  {
1400  int lnPos = 0;
1401  //Recuperem els parametres de la funció
1402  loParametros = new object[loMatchParams.Count];
1403  foreach (var item in loMatchParams)
1404  {
1405  loParametros[lnPos] = item.ToString().Replace("\"", "").Replace("'", "");
1406  lnPos++;
1407  }
1408  }
1409  }
1410  }
1411  }
1412  else
1413  {
1414  //Entenem que el que s'ha passat es una funció sense parametres
1415  if (!string.IsNullOrWhiteSpace(tcFuncion))
1416  lcFunction = tcFuncion;
1417  }
1418 
1419  //Comprobació final de nom de funció
1420  if (string.IsNullOrWhiteSpace(lcFunction))
1421  return "0";
1422 
1423  // PE-103236. Actualizar tabla CONNECT
1424  Usuario._This._Revisar_Connect_Formulario(lcFunction, lcFunction);
1425 
1426  //Tot correcte ... executem el metode estandar per funcions de VFP
1427  return _Ejecutar_Funcion_VFP(lcFunction, loParametros);
1428  }
1429 
1436  public static string _Obtener_Valor_VFP(string tcValor, object[] toParametros = null)
1437  {
1438  return Ejecutar_VFP("valor", tcValor, toParametros);
1439  }
1440 
1444  public static void _CerrarAplicacion()
1445  {
1446  Application.ExitThread();
1447  Application.Exit();
1448  }
1449 
1450 
1455  public static void _CerrarHandle(int lnHandle)
1456  {
1457  if (!IsWindow((IntPtr)lnHandle))
1458  return;
1459 
1460  // A partir del handle de fox, obtener el identificador del proceso y a partir de este el handle de la ventata principal
1461  GetWindowThreadProcessId((IntPtr)lnHandle, out uint processId);
1462  Process processSage50 = Process.GetProcessById(Convert.ToInt32(processId));
1463  IntPtr lnHandleSage50 = processSage50.MainWindowHandle;
1464  if (lnHandleSage50 == IntPtr.Zero)
1465  return;
1466 
1467  // Matar el proceso asociado a la ventanda de sage50
1468  Process[] runingProcess = Process.GetProcesses();
1469  for (int i = 0; i < runingProcess.Length; i++)
1470  {
1471  if (runingProcess[i].MainWindowHandle == lnHandleSage50)
1472  runingProcess[i].Kill();
1473  }
1474  }
1475 
1481  public static string _ToString(object txValor)
1482  {
1483  // String que devolveremos
1484  string lcValor = string.Empty;
1485 
1486  try
1487  {
1488  // Obtenemos el tipo del parámetro que nos han pasado
1489  string lcTipo = txValor.GetType().ToString().Trim().ToLower();
1490 
1491  switch (lcTipo)
1492  {
1493  case "system.boolean":
1494  if ((bool)txValor == true)
1495  lcValor = ".T.";
1496  else
1497  lcValor = ".F.";
1498 
1499  break;
1500 
1501  case "system.datetime":
1502  DateTime ltFecha = (DateTime)txValor;
1503  lcValor = "{^" +ltFecha.Year.ToString().Trim() + "-" + ltFecha.Month.ToString().Trim() +"-" + ltFecha.Day.ToString().Trim() + "}";
1504  break;
1505 
1506  case "system.decimal":
1507  case "system.double":
1508  case "system.int16":
1509  case "system.int32":
1510  case "system.int64":
1511  case "system.uint16":
1512  case "system.uint32":
1513  case "system.uint64":
1514  lcValor = txValor.ToString().Replace(",", ".").Trim();
1515  break;
1516 
1517  case "system.string":
1518  lcValor = "'" + txValor.ToString().Replace("'", "''") + "'";
1519  break;
1520 
1521  default:
1522  break;
1523  }
1524  }
1525  catch (Exception loEx)
1526  {
1527  DB.Registrar_Error(loEx);
1528  return string.Empty;
1529  }
1530 
1531  return lcValor;
1532  }
1533 
1534 
1539  public static void _ComprobarReceptor(long tnHwnd)
1540  {
1541  if (!IsWindow((IntPtr)tnHwnd))
1542  _CerrarAplicacion();
1543  }
1544 
1551  public static string _Abrir_Mante_VFP(string tcFormulario, string tcCodigo)
1552  {
1553  string lcRetorno = "";
1554 
1555  // Indicamos las propiedades de comunicación
1556  _Parametros["responder"] = true;
1557  _Parametros["opcion"] = "mante";
1558  _Parametros["tipo"] = "valor";
1559  _Parametros["valor"] = tcFormulario + NETVFP.SEPARADOR + tcCodigo + NETVFP.SEPARADOR;
1560 
1561  // Enviar mensaje a VFP
1562  if (_SendMessageToVfp())
1563  {
1564  // PE-80428. Comprobamos si en _Parametros todavía esta "valor". Hay veces que parece se ha perdido...
1565  if (NETVFP._Parametros.ContainsKey("valor"))
1566  lcRetorno = NETVFP._Parametros["valor"].ToString();
1567  }
1568 
1569  // Vaciar el diccionario de parametros una vez utilizado
1570  _Parametros.Clear();
1571 
1572  return lcRetorno;
1573  }
1574 
1579  public static void _Set_Form_AlwaysOnTop(IntPtr tnHandle)
1580  {
1581  IntPtr HWND_TOPMOST = new IntPtr(-1);
1582  const UInt32 SWP_NOSIZE = 0x0001;
1583  const UInt32 SWP_NOMOVE = 0x0002;
1584  const UInt32 SWP_SHOWWINDOW = 0x0040;
1585 
1586  SetWindowPos(tnHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
1587  }
1588 
1589  #endregion METODOS PUBLICOS
1590 
1591 
1592  #region METODOS PRIVADOS
1593  private static string Ejecutar_VFP(string tcOpcion, string tcFormFunc, object[] toParametros = null, bool tlRespuesta=true) // PE-93758
1602  {
1603  string lcRetorno = "", lcParametros = "";
1604 
1605  // PE-80275. Añadir control mediante CREATEMUTEX, OPENMUTEX para asegurar que desde FOX y NET estamos apunto para comunicar.
1606  if (!string.IsNullOrWhiteSpace(EW_GLOBAL._GetVariable("wc_iniservidor").ToString())
1607  && !string.IsNullOrWhiteSpace(EW_GLOBAL._GetVariable("wc_pathinicio").ToString()) // PE-91526. Comprobar si hay path inicio para enlazar
1608  && (tcFormFunc.ToUpper().Trim() == "FRM_NET"))
1609  {
1610  string lcFuncion = toParametros[0].ToString().ToUpper().Trim();
1611 
1612  if (lcFuncion == "INTEGRAR")
1613  {
1614  // Crear mutex para indicar que desde .NET estamos apunto para iniciar comunicación
1615  _nhMutexNet = CreateMutex(IntPtr.Zero, true, "SAGETPV_NET");
1616 
1617  // Comprobar/esperar que desde FOX estan apunto para comunicar
1618  IntPtr lnhMutexFox = IntPtr.Zero;
1619  uint MUTEX_ALL_ACCESS = 0x001F0001;
1620  bool llFoxOk = false;
1621  int lnTemps = 0;
1622  // PARTE 82286
1623  int lnTempsEspera = 60;
1624 
1625  string lcPathInicio = EW_GLOBAL._GetVariable("wc_pathinicio").ToString();
1626 
1627  // Certificamos que tenemos la ruta donde tenemos el CONFIG.INI
1628  if (string.IsNullOrWhiteSpace(lcPathInicio) == false)
1629  {
1630  string lcEnlace_Net = FUNCTIONS.LeerConfigIni("[ENLACE_NET]", lcPathInicio).Trim();
1631 
1632  // Primero certificamos que tiene la entrada en el CONFIG.INI no podemos realizar el ConvertToInt32
1633  if (string.IsNullOrWhiteSpace(lcEnlace_Net) == false)
1634  {
1635  int lnTempsENLACE_NET = Convert.ToInt32(lcEnlace_Net);
1636 
1637  // Si es superior a 60 lo tendremos en cuenta, no permitiremos un tiempo inferior a 60
1638  if (lnTempsENLACE_NET > 60)
1639  {
1640  lnTempsEspera = lnTempsENLACE_NET;
1641  }
1642  }
1643  }
1644  // FPARTE 82286
1645 
1646  DateTime lnTempsIni = DateTime.Now;
1647 
1648  while (!llFoxOk && lnTemps < lnTempsEspera) // PARTE 82286
1649  {
1650  // Consultar si el mutex de FOX ya está activo
1651  lnhMutexFox = OpenMutex(MUTEX_ALL_ACCESS, false, "SAGETPV_FOX");
1652  llFoxOk = (lnhMutexFox != IntPtr.Zero);
1653 
1654  // En caso que encontremos el mutex de FOX, ya lo descargamos de memoria
1655  if (llFoxOk)
1656  {
1657  ReleaseMutex(lnhMutexFox);
1658  CloseHandle(lnhMutexFox);
1659  }
1660 
1661  // En caso de no encontrar el mutex de fox en 1 minuto salimos
1662  lnTemps = (DateTime.Now - lnTempsIni).Seconds;
1663 
1664  Application.DoEvents();
1665  }
1666  }
1667 
1668  _lCerrarFormulariosEWCanal2 = (lcFuncion == "CERRAR");
1669 
1670  if ((lcFuncion == "CERRAR") && (_nhMutexNet != IntPtr.Zero))
1671  {
1672  // Eliminar de memoria el mutex de NET
1673  ReleaseMutex(_nhMutexNet);
1674  CloseHandle(_nhMutexNet);
1675  }
1676  }
1677  // FI PE-80275
1678 
1679  if (tcOpcion == "crear")
1680  {
1681  // PE-103236. Actualizar tabla CONNECT
1682  Usuario._This._Revisar_Connect_Formulario(tcFormFunc, tcFormFunc);
1683 
1684  tcFormFunc = "'" + tcFormFunc + "'";
1685  }
1686 
1687  // Minimizar formularios .net abiertos para ver el formulario de fox que se abre en primer plano. Task 143679
1688  if (tcOpcion == "crear" || CasosEspecialesMinimizar(tcFormFunc))
1689  MinimizarFormsNetAbiertos();
1690 
1691  // Preparamos los parámetros con el formato correcto en caso necesario
1692  if (toParametros != null)
1693  {
1694  foreach (object loPar in toParametros)
1695  {
1696  lcParametros = lcParametros + _ToString(loPar) + NETVFP.SEPARADOR;
1697  }
1698  }
1699 
1700  // Indicamos las propiedades de comunicación
1701  _Parametros["responder"] = (tlRespuesta ? true : false);
1702  _Parametros["opcion"] = tcOpcion;
1703  _Parametros["tipo"] = "valor";
1704  _Parametros["valor"] = tcFormFunc + NETVFP.SEPARADOR + lcParametros;
1705 
1706  // Enviar mensaje a VFP
1707  if (_SendMessageToVfp())
1708  {
1709  // PE-80428. Comprobamos si en _Parametros todavía esta "valor". Hay veces que parece se ha perdido...
1710  if (NETVFP._Parametros.ContainsKey("valor"))
1711  lcRetorno = NETVFP._Parametros["valor"].ToString();
1712  }
1713 
1714  // Vaciar el diccionario de parametros una vez utilizado
1715  _Parametros.Clear();
1716 
1717  // Restaurar formularios .net abiertos al cerrar formulario de fox. Task 143679
1718  if (tcOpcion == "crear" || CasosEspecialesMinimizar(tcFormFunc))
1719  RestaurarFormsNetMinimizados();
1720 
1721  return lcRetorno;
1722  }
1723 
1729  private static bool CasosEspecialesMinimizar(string tcFormFunc)
1730  {
1731  bool llCasoEspecial = false;
1732 
1733  string lcCasosEspeciales = "RIESGO_CLIENTE_NET,GENERAR_SEPA_REMCOBRO_NET,GENERAR_SEPA_REMPAGO_NET,SAGE50_ENLACE_COMUNICADOS";
1734 
1735  tcFormFunc = tcFormFunc.ToUpper().Trim();
1736  llCasoEspecial = lcCasosEspeciales.Contains(tcFormFunc);
1737 
1738  return llCasoEspecial;
1739  }
1740 
1744  private static void MinimizarFormsNetAbiertos()
1745  {
1746  // Los formularios ActiveMenuImp son los pequeños formularios que se incrustan en las captions de los formularios con los "...", no minimizarlos
1747  string lcFormsExcluidos = "frmprincipal,activemenuimpl";
1748 
1749  // Si tenemos el widget de listas previas, este no hay que minimizarlo. Bug 146238.
1750  if (FUNCTIONS._CheckWidgetExists(new WidgetFormTabs()))
1751  lcFormsExcluidos += ",formtabs,browsertab";
1752 
1753  foreach (Form frm in Application.OpenForms)
1754  {
1755  string lcForm = frm.Name.ToLower().Trim();
1756 
1757  if (!lcFormsExcluidos.Contains(lcForm))
1758  ShowWindow(frm.Handle, SW_MINIMIZE);
1759  }
1760  }
1761 
1765  private static void RestaurarFormsNetMinimizados()
1766  {
1767  // Bug 146157. No hay que restaurar el formulario de listas previas(FormTabs), ya que en su propia gestión se realiza.
1768  string lcFormsExcluidos = "frmprincipal,activemenuimpl,formtabs";
1769  foreach (Form frm in Application.OpenForms)
1770  {
1771  string lcForm = frm.Name.ToLower().Trim();
1772 
1773  if (!lcFormsExcluidos.Contains(lcForm) && frm.WindowState == FormWindowState.Minimized)
1774  ShowWindow(frm.Handle, SW_RESTORE);
1775  }
1776  }
1777 
1781  private static void RegisterWindowMessages()
1782  {
1783  // Mensaje Generico desde el Eurowin (VFP) al .Net
1784  if (msgewvfp_Notification == IntPtr.Zero)
1785  msgewvfp_Notification = RegisterWindowMessageW(EWVFP_NOTIFICATION);
1786 
1787  // Mensaje Generico desde el .Net al Eurowin (VFP)
1788  if (msgewnet_Notification == IntPtr.Zero)
1789  msgewnet_Notification = RegisterWindowMessageW(EWNET_NOTIFICATION);
1790 
1791  // Mensaje Generico SAGE50 NIVEL 1 (PE-93758)
1792  if (msgSage50_Notification == IntPtr.Zero)
1793  msgSage50_Notification = RegisterWindowMessageW(SAGE50_NOTIFICATION);
1794 
1795  // Mensaje Generico SAGE50 NIVEL 2 (PE-93758)
1796  if (msgSage50_Notification2 == IntPtr.Zero)
1797  msgSage50_Notification2 = RegisterWindowMessageW(SAGE50_NOTIFICATION2);
1798 
1799  // Mensaje Generico SAGE50 NIVEL 3 (PE-100744)
1800  if (msgSage50_Notification3 == IntPtr.Zero)
1801  msgSage50_Notification3 = RegisterWindowMessageW(SAGE50_NOTIFICATION3);
1802 
1803  // Mensaje Generico SAGE50 NIVEL 4 (PE-100744)
1804  if (msgSage50_Notification4 == IntPtr.Zero)
1805  msgSage50_Notification4 = RegisterWindowMessageW(SAGE50_NOTIFICATION4);
1806 
1807  // Mensaje Generico SAGE50 NIVEL 5 (PE-100744)
1808  if (msgSage50_Notification5 == IntPtr.Zero)
1809  msgSage50_Notification5 = RegisterWindowMessageW(SAGE50_NOTIFICATION5);
1810  }
1811 
1816  private static void EliminarMensaje(ref Message msgEliminar)
1817  {
1818  GlobalDeleteAtom((ushort)msgEliminar.WParam);
1819  }
1820 
1826  private static string ObtenerCadenaMensaje(Message msgParam)
1827  {
1828  char[] swParam = new char[(int)msgParam.LParam];
1829  GlobalGetAtomName((ushort)msgParam.WParam, swParam, (int)msgParam.LParam);
1830  string lcCadena = new string(swParam);
1831 
1832  return lcCadena;
1833  }
1834 
1840  private static bool CargaInicial(string tcRutaXml)
1841  {
1842  // Hacer una copia del xml para volver a cargar los valores después de la carga de los diccionarios
1843  bool llAlbatpv = false;
1844  bool llOk = false; // PE-85575
1845  string lcMensaje = string.Empty;
1846  string lcCopiaXml = tcRutaXml.Replace(".xml", "copia.xml");
1847  File.Copy(tcRutaXml, lcCopiaXml);
1848 
1849  // Realizar la carga de las distintas variables que nos indiquen en el diccionario global
1850  if (!EW_GLOBAL._CargarVarExtra(tcRutaXml))
1851  {
1852  MessageBox.Show("No se ha podido cargar en el diccionario las variables globales extra.", "EW_GLOBAL._CargarVarExtra", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
1853  return false;
1854  }
1855 
1856  // Obtenemos las variables del diccionario global
1857  string lcUsuario = EW_GLOBAL._GetVariable("wc_usuario").ToString().Trim();
1858  string lcEmpresa = EW_GLOBAL._GetVariable("wc_empresa").ToString().Trim();
1859  string lcCajaTpv = EW_GLOBAL._GetVariable("wc_cajatpv").ToString().Trim();
1860  string lcComunes = EW_GLOBAL._GetVariable("wc_concomunes").ToString().Trim();
1861  string lcServer = EW_GLOBAL._GetVariable("server").ToString().Trim();
1862  string lcUser = EW_GLOBAL._GetVariable("user").ToString().Trim();
1863  string lcPassword = EW_GLOBAL._GetVariable("password").ToString().Trim();
1864  string lcLibreria = EW_GLOBAL._GetVariable("libreria").ToString().Trim();
1865  string lcForm = EW_GLOBAL._GetVariable("formulario").ToString().Trim();
1866  string lcOpcion = EW_GLOBAL._GetVariable("opcion").ToString().Trim();
1867 
1868  // PE-102233 - Si ejecutamos las gráficas no hace comprobar nada
1869  // PE-88209
1870  // Si venimos de las graficas de FOX llamadas desde Eurowin, no hace falta connectarse, ni cargar diccionarios, ni nada más.
1871  if (lcForm == "sage.ew.Forms.VerGraficas")
1872  return true;
1873 
1874 
1875  // Controlamos si entramos en la pantalla de albatpv
1876  llAlbatpv = (lcOpcion == "albatpv" || lcOpcion == "albaven");
1877 
1878  // Comprobar que nos llegan los valores obligatorios
1879  if (string.IsNullOrWhiteSpace(lcEmpresa) || string.IsNullOrWhiteSpace(lcComunes) ||
1880  string.IsNullOrWhiteSpace(lcServer) || string.IsNullOrWhiteSpace(lcUser) || string.IsNullOrWhiteSpace(lcPassword) ||
1881  string.IsNullOrWhiteSpace(lcLibreria) || string.IsNullOrWhiteSpace(lcForm) || string.IsNullOrWhiteSpace(lcUsuario) ||
1882  (llAlbatpv && (string.IsNullOrWhiteSpace(lcCajaTpv)))) // Solo controlaremos el controls de la caja actiav si entramos a la pantalla albatpv
1883  {
1884  // De momento la caja solo la controlaremos en la pantalla de ALBATPV
1885  if (llAlbatpv)
1886  lcMensaje = " wc_cajatpv,";
1887 
1888  MessageBox.Show("Deben indicarse las siguientes etiquetas obligatoriamente:"+System.Environment.NewLine+
1889  "wc_usuario, wc_empresa," + lcMensaje + " wc_concomunes, server, user, password, libreria, formulario","Etiquetas obligatorias",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
1890  return false;
1891  }
1892 
1893  // Conectar a la base de datos
1894  if (!DB.SQLConnect(lcServer, lcUser, lcPassword, lcComunes, tcAliasConexion: "eurowin"))
1895  {
1896  MessageBox.Show("No se ha podido realizar la conexión a la base de datos.", "DB.SQLConnect", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
1897  return false;
1898  }
1899 
1900  // PE-87417. Mover la predeterminación de la bd de gestión antes de realizar la Carga de diccionarios, sino en la carga de diccionarios sigue apuntando al ejercicio anterior...
1901  //PE-84869: predeterminamos como gestión el ejercicio que nos viene definido por la variable wc_any (por ejemplo por cambiar de ejercicio desde el desplegable de Eurowin)
1902  //ya que si no siempre se ejecutaba el TPV de .NET en el ejercicio predeterminado de Comunes!ejercici, lo cual no es correcto si hemos cambiado el ejercicio de trabajo en Eurowin
1903  if (EW_GLOBAL._GetVariable("wc_any") != null)
1904  {
1905  DB.SQLPredeterminarGestion(Convert.ToString(EW_GLOBAL._GetVariable("wc_any")));
1906  }
1907 
1908  // PE-85575. En caso de abrir un formulario de graficas no es necesario tener el módulo de tpv
1909  // Cargar las variables globales
1910  if (lcForm.ToLower().Trim().Contains("grafica") && string.IsNullOrWhiteSpace(lcCajaTpv))
1911  llOk = DiccionariosLoader.CargarDiccionarios(lcEmpresa);
1912  else
1913  llOk = DiccionariosLoader.CargarDiccionarios(lcEmpresa, lcCajaTpv);
1914 
1915  if (!llOk)
1916  {
1917  MessageBox.Show("No se han podido cargar los diccionario de variables globales.", "EW_GLOBAL._CargarDiccionarios", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
1918  return false;
1919  }
1920  // FI PE-85575
1921 
1922  // Volvemos a cargar las distintas variables que nos indiquen en el diccionario global ya que en la carga de diccionarios se han machacado
1923  if (!EW_GLOBAL._CargarVarExtra(lcCopiaXml))
1924  {
1925  MessageBox.Show("No se ha podido cargar en el diccionario las variables globales extra.", "EW_GLOBAL._CargarVarExtra", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
1926  return false;
1927  }
1928 
1929  // PE-106793. Sino estamos en sage50 tenemos que cargar y validar la licencia de suscripción de sagelic.
1930  if ( !Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")) && !LICENCIAS._Validar_Licencia_Suscripcion() )
1931  {
1932  MessageBox.Show(LICENCIAS._MensajeError, "LICENCIAS._Validar_Licencia_Suscripcion", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
1933  return false;
1934  }
1935 
1936  // PE-89537: Asignamos el valor proviniente de la variable SQL_LOG del config.ini
1937  // [SQL_LOG] en Config.ini, "wc_sql_log" en .NET
1938  string lcSqlLog = Convert.ToString(FUNCTIONS.LeerConfigIni("[SQL_LOG]")).ToUpper().Trim();
1939 
1940  EW_GLOBAL._SetVariable("wc_sql_log", lcSqlLog);
1941  //FI PE-89537
1942 
1943  // PE-85745. Asignamos si trabajamos con PRUEVAS SI
1944  // La variable de Eurowin y de .NET. es "wl_prueva"
1945  // En el Config.INI tenemos [PRUEVAS]
1946  string lcPrueva = Convert.ToString(FUNCTIONS.LeerConfigIni("[PRUEVAS]")).ToUpper();
1947 
1948  bool llPrueva = (lcPrueva == "SI" || lcPrueva == "PERMANENTE");
1949 
1950  EW_GLOBAL._SetVariable("wl_prueva", llPrueva);
1951  // FPE-85745
1952 
1953  // PE-96322. Cargamos los addons (modulos, pam)
1955  {
1956  GenerarChecksumOpciones = Criptografia.GenerarChecksumOpciones,
1957  GetSage50PathLibrerias = FUNCTIONS.GetSage50PathLibrerias,
1958  CodigoLicencia = LICENCIAS._CodigoLicencia
1959  }))
1960  {
1961  MessageBox.Show("Uno o más de los AddOn instalados no se han cargado correctamente.", "EW_GLOBAL._CargarAddOns", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
1962  }
1963 
1964  return true;
1965  }
1966 
1974  private static string GenerarParametrosXml(string tcFuncion, object[] toParametros, string tcNomCursor="net2vfp")
1975  {
1976 
1977  //Genero un nombre aleatorio.
1978  string lcNombreFichero = Path.GetTempPath() + System.Guid.NewGuid().ToString() + ".xml";
1979 
1980  // Preparamos los parámetros con el formato correcto en caso necesario
1981  if (toParametros != null)
1982  {
1983 
1984  string lcNodo = string.Empty, lcValor = string.Empty;
1985  int lnTotalElementos = 0;
1986  int lnElementoActual = 0;
1987  int lnXElem = 0;
1988  int lnYElem = 0;
1989 
1990  //Creo la parte fija del fichero XML que voy a generar
1991  XmlTextWriter xmlParan = new XmlTextWriter(lcNombreFichero, Encoding.UTF8)
1992  {
1993  Formatting = Formatting.Indented
1994  };
1995  xmlParan.WriteStartDocument();
1996  xmlParan.WriteStartElement("VFPData");
1997 
1998  //Recupero los parámetros recibidos
1999  foreach (object loPar in toParametros)
2000  {
2001 
2002  //Evito los valores nulos pero al ser un array continuo buscando valores válidos
2003  if (loPar != null)
2004  {
2005 
2006  xmlParan.WriteStartElement(tcNomCursor.ToString().Trim()); //Creo nodo NombreCursor
2007 
2008  //Funcion
2009  xmlParan.WriteElementString("funcion", tcFuncion.ToString().ToUpper());
2010 
2011  //Capturo el tipo
2012  string lcTipo = loPar.GetType().ToString().Trim().ToLower();
2013 
2014  switch (lcTipo)
2015  {
2016 
2017  #region Matrices [x,y]
2018 
2019  #region MatrizStrings
2020  case "system.string[,]":
2021 
2022  //Variables para el doble recorrido
2023  lnXElem = ((string[,])loPar).GetLength(0); //Numero de dimensiones
2024  lnYElem = ((string[,])loPar).Length / lnXElem; //Numero de elementos (total/dimensiones)
2025 
2026  //Preparo el nombre
2027  xmlParan.WriteElementString("tipo_param", "STRING:ARRAY[" + lnXElem.ToString() + "," + lnYElem.ToString() + "]");
2028 
2029  //Recorro las N dimensiones de la matriz
2030  for (int lnXindex = 0; lnXindex < lnXElem; lnXindex++)
2031  {
2032  //Preparo la concatenacion de valores
2033  for (int lnYIndex = 0; lnYIndex < lnYElem; lnYIndex++)
2034  {
2035  lcValor = lcValor + "'" + ((string[,])loPar)[lnXindex, lnYIndex].ToString().Replace("'", "''") + "'";
2036  if (lnYIndex != lnYElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2037  }
2038 
2039  if (lnXindex != lnXElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2040  //Reinicio para siguiente elemento
2041  //lcValor = string.Empty;
2042  }
2043  //Asigno el valor
2044  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2045 
2046 
2047  //Vacio para el siguiente elemento
2048  lcValor = string.Empty;
2049  lnTotalElementos = 0;
2050  lnXElem = lnYElem = 0;
2051 
2052  break;
2053  #endregion MatrizStrings
2054 
2055  #region MatrizDecimal
2056  case "system.decimal[,]":
2057 
2058  //Variables para el doble recorrido
2059  lnXElem = ((decimal[,])loPar).GetLength(0); //Numero de dimensiones
2060  lnYElem = ((decimal[,])loPar).Length / lnXElem; //Numero de elementos (total/dimensiones)
2061 
2062  //Preparo el nombre
2063  xmlParan.WriteElementString("tipo_param", "DECIMAL:ARRAY[" + lnXElem.ToString() + "," + lnYElem.ToString() + "]");
2064 
2065  //Recorro las N dimensiones de la matriz
2066  for (int lnXindex = 0; lnXindex < lnXElem; lnXindex++)
2067  {
2068  //Preparo la concatenacion de valores
2069  for (int lnYIndex = 0; lnYIndex < lnYElem; lnYIndex++)
2070  {
2071  lcValor = lcValor + ((decimal[,])loPar)[lnXindex, lnYIndex].ToString().Replace(",", ".").Trim();
2072  if (lnYIndex != lnYElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2073  }
2074 
2075  if (lnXindex != lnXElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2076  //Reinicio para siguiente elemento
2077  //lcValor = string.Empty;
2078  }
2079  //Asigno el valor
2080  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2081 
2082  //Vacio para el siguiente elemento
2083  lcValor = string.Empty;
2084  lnTotalElementos = 0;
2085  lnXElem = lnYElem = 0;
2086 
2087  break;
2088  #endregion MatrizDecimal
2089 
2090  #region MatrizInt32
2091  case "system.int32[,]":
2092 
2093  //Variables para el doble recorrido
2094  lnXElem = ((Int32[,])loPar).GetLength(0); //Numero de dimensiones
2095  lnYElem = ((Int32[,])loPar).Length / lnXElem; //Numero de elementos (total/dimensiones)
2096 
2097  //Preparo el nombre
2098  xmlParan.WriteElementString("tipo_param", "INT32:ARRAY[" + lnXElem.ToString() + "," + lnYElem.ToString() + "]");
2099 
2100  //Recorro las N dimensiones de la matriz
2101  for (int lnXindex = 0; lnXindex < lnXElem; lnXindex++)
2102  {
2103  //Preparo la concatenacion de valores
2104  for (int lnYIndex = 0; lnYIndex < lnYElem; lnYIndex++)
2105  {
2106  lcValor = lcValor + ((Int32[,])loPar)[lnXindex, lnYIndex].ToString().Replace(",", ".").Trim();
2107  if (lnYIndex != lnYElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2108  }
2109  if (lnXindex != lnXElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2110  //Asigno el valor
2111  //xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2112  //Reinicio para siguiente elemento
2113  //lcValor = string.Empty;
2114  }
2115  //Asigno el valor
2116  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2117 
2118  //Vacio para el siguiente elemento
2119  lcValor = string.Empty;
2120  lnTotalElementos = 0;
2121  lnXElem = lnYElem = 0;
2122 
2123  break;
2124  #endregion MatrizInt32
2125 
2126  #region MatrizInt16
2127  case "system.int16[,]":
2128 
2129  //Variables para el doble recorrido
2130  lnXElem = ((Int16[,])loPar).GetLength(0); //Numero de dimensiones
2131  lnYElem = ((Int16[,])loPar).Length / lnXElem; //Numero de elementos (total/dimensiones)
2132 
2133  //Preparo el nombre
2134  xmlParan.WriteElementString("tipo_param", "INT16:ARRAY[" + lnXElem.ToString() + "," + lnYElem.ToString() + "]");
2135 
2136  //Recorro las N dimensiones de la matriz
2137  for (int lnXindex = 0; lnXindex < lnXElem; lnXindex++)
2138  {
2139  //Preparo la concatenacion de valores
2140  for (int lnYIndex = 0; lnYIndex < lnYElem; lnYIndex++)
2141  {
2142  lcValor = lcValor + ((Int16[,])loPar)[lnXindex, lnYIndex].ToString().Replace(",", ".").Trim();
2143  if (lnYIndex != lnYElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2144  }
2145  if (lnXindex != lnXElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2146  //Asigno el valor
2147  //xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2148  //Reinicio para siguiente elemento
2149  //lcValor = string.Empty;
2150  }
2151  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2152 
2153  //Vacio para el siguiente elemento
2154  lcValor = string.Empty;
2155  lnTotalElementos = 0;
2156  lnXElem = lnYElem = 0;
2157 
2158  break;
2159  #endregion MatrizInt16
2160 
2161  #region MatrizInt64
2162  case "system.int64[,]":
2163 
2164  //Variables para el doble recorrido
2165  lnXElem = ((Int64[,])loPar).GetLength(0); //Numero de dimensiones
2166  lnYElem = ((Int64[,])loPar).Length / lnXElem; //Numero de elementos (total/dimensiones)
2167 
2168  //Preparo el nombre
2169  xmlParan.WriteElementString("tipo_param", "INT64:ARRAY[" + lnXElem.ToString() + "," + lnYElem.ToString() + "]");
2170 
2171  //Recorro las N dimensiones de la matriz
2172  for (int lnXindex = 0; lnXindex < lnXElem; lnXindex++)
2173  {
2174  //Preparo la concatenacion de valores
2175  for (int lnYIndex = 0; lnYIndex < lnYElem; lnYIndex++)
2176  {
2177  lcValor = lcValor + ((Int64[,])loPar)[lnXindex, lnYIndex].ToString().Replace(",", ".").Trim();
2178  if (lnYIndex != lnYElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2179  }
2180  if (lnXindex != lnXElem - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2181  //Asigno el valor
2182  //xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2183  //Reinicio para siguiente elemento
2184  // lcValor = string.Empty;
2185  }
2186  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2187 
2188  //Vacio para el siguiente elemento
2189  lcValor = string.Empty;
2190  lnTotalElementos = 0;
2191  lnXElem = lnYElem = 0;
2192 
2193  break;
2194  #endregion MatrizInt64
2195 
2196  #endregion Matrices [x,y]
2197 
2198  #region Arrays
2199 
2200  #region ArrayStrings
2201  case "system.string[]":
2202 
2203  //Preparo el nombre
2204  xmlParan.WriteElementString("tipo_param", "STRING:ARRAY");
2205 
2206  //Numero de elementos
2207  lnTotalElementos = ((string[])loPar).Length;
2208  //Preparo la concatenacion de valores
2209  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2210  {
2211  lcValor = lcValor + "'" + ((string[])loPar)[lnIndex].ToString().Replace("'", "''") + "'";
2212  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2213  }
2214 
2215  //Asigno el valor
2216  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2217 
2218  //Vacio para el siguiente elemento
2219  lcValor = string.Empty;
2220  lnTotalElementos = 0;
2221 
2222  break;
2223  #endregion ArrayStrings
2224 
2225  #region ArrayBoleanos
2226  case "system.boolean[]":
2227 
2228  //Preparo el nombre
2229  lcNodo = ((bool[])loPar)[0].GetType().ToString().Trim().ToUpper().Substring(7);
2230  xmlParan.WriteElementString("tipo_param", "BOOLEAN:ARRAY");
2231 
2232  //Numero de elementos
2233  lnTotalElementos = ((bool[])loPar).Length;
2234  //Preparo la concatenacion de valores
2235  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2236  {
2237 
2238  if (((bool[])loPar)[lnIndex]) { lcValor = lcValor + ".T."; }
2239  else { lcValor = lcValor + ".F."; }
2240  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2241  }
2242 
2243  //Asigno el valor
2244  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2245 
2246  //Vacio para el siguiente elemento
2247  lcValor = string.Empty;
2248  lnTotalElementos = 0;
2249  break;
2250 
2251  #endregion ArrayBoleanos
2252 
2253  #region ArrayDateTime
2254  case "system.datetime[]":
2255 
2256  //Preparo el nombre
2257  lcNodo = ((DateTime[])loPar)[0].GetType().ToString().Trim().ToUpper().Substring(7);
2258  xmlParan.WriteElementString("tipo_param", "DATETIME:ARRAY");
2259 
2260  //Numero de elementos
2261  lnTotalElementos = ((DateTime[])loPar).Length;
2262  //Preparo la concatenacion de valores
2263  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2264  {
2265  lcValor = lcValor + "{^" + ((DateTime[])loPar)[lnIndex].Year.ToString().Trim() + "-" +
2266  ((DateTime[])loPar)[lnIndex].Month.ToString().Trim() + "-" +
2267  ((DateTime[])loPar)[lnIndex].Day.ToString().Trim() + "}";
2268  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2269  }
2270 
2271  //Asigno el valor
2272  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2273 
2274  //Vacio para el siguiente elemento
2275  lcValor = string.Empty;
2276  lnTotalElementos = 0;
2277  break;
2278 
2279  #endregion ArrayDateTime
2280 
2281  #region ArrayDecimal
2282  case "system.decimal[]":
2283 
2284  //Preparo el nombre
2285  xmlParan.WriteElementString("tipo_param", "DECIMAL:ARRAY");
2286 
2287  //Numero de elementos
2288  lnTotalElementos = ((decimal[])loPar).Length;
2289  //Preparo la concatenacion de valores
2290  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2291  {
2292  lcValor = lcValor + ((decimal[])loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2293  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2294  }
2295 
2296  //Asigno el valor
2297  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2298 
2299  //Vacio para el siguiente elemento
2300  lcValor = string.Empty;
2301  lnTotalElementos = 0;
2302  break;
2303 
2304  #endregion ArrayDecimal
2305 
2306  #region ArrayDeDouble
2307  case "system.double[]":
2308 
2309  //Preparo el nombre
2310  lcNodo = ((double[])loPar)[0].GetType().ToString().Trim().ToUpper().Substring(7);
2311  xmlParan.WriteElementString("tipo_param", lcNodo + ":ARRAY");
2312 
2313  lnTotalElementos = ((double[])loPar).Length;
2314 
2315  //Preparo la concatenacion de valores
2316  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2317  {
2318  lcValor = lcValor + ((double[])loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2319  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2320  }
2321 
2322  //Asigno el valor
2323  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2324 
2325  //Vacio para el siguiente elemento
2326  lcValor = string.Empty;
2327  lcNodo = string.Empty;
2328  lnTotalElementos = 0;
2329  break;
2330 
2331  #endregion ArrayDeDouble
2332 
2333  #region ArrayDeInt32
2334  case "system.int32[]":
2335 
2336  //Preparo el nombre
2337  xmlParan.WriteElementString("tipo_param", "INT32:ARRAY");
2338 
2339  //Numero de elementos
2340  lnTotalElementos = ((Int32[])loPar).Length;
2341  //Preparo la concatenacion de valores
2342  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2343  {
2344  lcValor = lcValor + ((Int32[])loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2345  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2346  }
2347 
2348  //Asigno el valor
2349  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2350 
2351  //Vacio para el siguiente elemento
2352  lcValor = string.Empty;
2353  lnTotalElementos = 0;
2354  break;
2355 
2356  #endregion ArrayDeInt32
2357 
2358  #region ArrayDeInt16
2359  case "system.int16[]":
2360 
2361  //Preparo el nombre
2362  xmlParan.WriteElementString("tipo_param", "INT16:ARRAY");
2363 
2364  //Numero de elementos
2365  lnTotalElementos = ((Int16[])loPar).Length;
2366  //Preparo la concatenacion de valores
2367  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2368  {
2369  lcValor = lcValor + ((Int16[])loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2370  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2371  }
2372 
2373  //Asigno el valor
2374  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2375 
2376  //Vacio para el siguiente elemento
2377  lcValor = string.Empty;
2378  lnTotalElementos = 0;
2379  break;
2380 
2381  #endregion ArrayDeInt16
2382 
2383  #region ArrayDeInt64
2384  case "system.int64[]":
2385 
2386  //Preparo el nombre
2387  xmlParan.WriteElementString("tipo_param", "INT32:ARRAY");
2388 
2389  //Numero de elementos
2390  lnTotalElementos = ((Int64[])loPar).Length;
2391  //Preparo la concatenacion de valores
2392  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2393  {
2394  lcValor = lcValor + ((Int64[])loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2395  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2396  }
2397 
2398  //Asigno el valor
2399  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2400 
2401  //Vacio para el siguiente elemento
2402  lcValor = string.Empty;
2403  lnTotalElementos = 0;
2404  break;
2405 
2406  #endregion ArrayDeInt64
2407 
2408  #region ArrayDeUInt16
2409  case "system.uint16[]":
2410 
2411  //Preparo el nombre
2412  xmlParan.WriteElementString("tipo_param", "UINT16:ARRAY");
2413 
2414  //Numero de elementos
2415  lnTotalElementos = ((UInt16[])loPar).Length;
2416  //Preparo la concatenacion de valores
2417  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2418  {
2419  lcValor = lcValor + ((UInt16[])loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2420  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2421  }
2422 
2423  //Asigno el valor
2424  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2425 
2426  //Vacio para el siguiente elemento
2427  lcValor = string.Empty;
2428  lnTotalElementos = 0;
2429  break;
2430 
2431  #endregion ArrayDeUInt16
2432 
2433  #region ArrayDeUInt32
2434  case "system.uint32[]":
2435 
2436  //Preparo el nombre
2437  xmlParan.WriteElementString("tipo_param", "UINT32:ARRAY");
2438 
2439  //Numero de elementos
2440  lnTotalElementos = ((UInt32[])loPar).Length;
2441  //Preparo la concatenacion de valores
2442  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2443  {
2444  lcValor = lcValor + ((UInt32[])loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2445  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2446  }
2447 
2448  //Asigno el valor
2449  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2450 
2451  //Vacio para el siguiente elemento
2452  lcValor = string.Empty;
2453  lnTotalElementos = 0;
2454  break;
2455 
2456  #endregion ArrayDeUInt32
2457 
2458  #region ArrayDeUInt64
2459  case "system.uint64[]":
2460 
2461  //Preparo el nombre
2462  xmlParan.WriteElementString("tipo_param", "UINT64:ARRAY");
2463 
2464  //Numero de elementos
2465  lnTotalElementos = ((UInt64[])loPar).Length;
2466  //Preparo la concatenacion de valores
2467  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2468  {
2469  lcValor = lcValor + ((UInt64[])loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2470  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2471  }
2472 
2473  //Asigno el valor
2474  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2475 
2476  //Vacio para el siguiente elemento
2477  lcValor = string.Empty;
2478  lnTotalElementos = 0;
2479  break;
2480 
2481  #endregion ArrayDeUInt64
2482 
2483  #endregion Arrays
2484 
2485  #region Listas (List<T>)
2486 
2487  #region ListaDeStrings
2488  case "system.collections.generic.list`1[system.string]":
2489 
2490  //Preparo el nombre
2491  xmlParan.WriteElementString("tipo_param", "STRING:ARRAY");
2492 
2493  //Numero de elementos
2494  lnTotalElementos = ((List<string>)loPar).Count;
2495  //Preparo la concatenacion de valores
2496  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2497  {
2498  lcValor = lcValor + "'" + ((List<string>)loPar)[lnIndex].ToString().Replace("'", "''") + "'";
2499  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2500  }
2501 
2502  //Asigno el valor
2503  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2504 
2505  //Vacio para el siguiente elemento
2506  lcValor = string.Empty;
2507  lnTotalElementos = 0;
2508  break;
2509 
2510  #endregion ListaDeStrings
2511 
2512  #region ListaDeBoleanos
2513  case "system.collections.generic.list`1[system.boolean]":
2514 
2515  //Preparo el nombre
2516  lcNodo = ((List<bool>)loPar)[0].GetType().ToString().Trim().ToUpper().Substring(7);
2517  xmlParan.WriteElementString("tipo_param", "BOOLEAN:ARRAY");
2518 
2519  //Numero de elementos
2520  lnTotalElementos = ((List<bool>)loPar).Count;
2521  //Preparo la concatenacion de valores
2522  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2523  {
2524 
2525  if (((List<bool>)loPar)[lnIndex]) { lcValor = lcValor + ".T."; }
2526  else { lcValor = lcValor + ".F."; }
2527  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2528  }
2529 
2530  //Asigno el valor
2531  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2532 
2533  //Vacio para el siguiente elemento
2534  lcValor = string.Empty;
2535  lnTotalElementos = 0;
2536  break;
2537 
2538  #endregion ListaDeBoleanos
2539 
2540  #region ListaDeDateTime
2541  case "system.collections.generic.list`1[system.datetime]":
2542 
2543  //Preparo el nombre
2544  lcNodo = ((List<DateTime>)loPar)[0].GetType().ToString().Trim().ToUpper().Substring(7);
2545  xmlParan.WriteElementString("tipo_param", "DATETIME:ARRAY");
2546 
2547  //Numero de elementos
2548  lnTotalElementos = ((List<DateTime>)loPar).Count;
2549  //Preparo la concatenacion de valores
2550  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2551  {
2552  lcValor = lcValor + "{^" + ((List<DateTime>)loPar)[lnIndex].Year.ToString().Trim() + "-" +
2553  ((List<DateTime>)loPar)[lnIndex].Month.ToString().Trim() + "-" +
2554  ((List<DateTime>)loPar)[lnIndex].Day.ToString().Trim() + "}";
2555  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2556  }
2557 
2558  //Asigno el valor
2559  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2560 
2561  //Vacio para el siguiente elemento
2562  lcValor = string.Empty;
2563  lnTotalElementos = 0;
2564  break;
2565 
2566  #endregion ListaDeDateTime
2567 
2568  #region ListaDeDecimal
2569  case "system.collections.generic.list`1[system.decimal]":
2570 
2571  //Preparo el nombre
2572  xmlParan.WriteElementString("tipo_param", "DECIMAL:ARRAY");
2573 
2574  //Numero de elementos
2575  lnTotalElementos = ((List<decimal>)loPar).Count;
2576  //Preparo la concatenacion de valores
2577  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2578  {
2579  lcValor = lcValor + ((List<decimal>)loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2580  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2581  }
2582 
2583  //Asigno el valor
2584  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2585 
2586  //Vacio para el siguiente elemento
2587  lcValor = string.Empty;
2588  lnTotalElementos = 0;
2589  break;
2590 
2591  #endregion ListaDeDecimal
2592 
2593  #region ListaDeDouble
2594  case "system.collections.generic.list`1[system.double]":
2595 
2596  //Preparo el nombre
2597  lcNodo = ((List<double>)loPar)[0].GetType().ToString().Trim().ToUpper().Substring(7);
2598  xmlParan.WriteElementString("tipo_param", lcNodo + ":ARRAY");
2599 
2600  lnTotalElementos = ((List<double>)loPar).Count;
2601 
2602  //Preparo la concatenacion de valores
2603  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2604  {
2605  lcValor = lcValor + ((List<double>)loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2606  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2607  }
2608 
2609  //Asigno el valor
2610  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2611 
2612  //Vacio para el siguiente elemento
2613  lcValor = string.Empty;
2614  lcNodo = string.Empty;
2615  lnTotalElementos = 0;
2616  break;
2617 
2618  #endregion ListaDeDouble
2619 
2620  #region ListaDeInt16
2621  case "system.collections.generic.list`1[system.int16]":
2622 
2623  //Preparo el nombre
2624  xmlParan.WriteElementString("tipo_param", "INT16:ARRAY");
2625 
2626  //Numero de elementos
2627  lnTotalElementos = ((List<Int16>)loPar).Count;
2628  //Preparo la concatenacion de valores
2629  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2630  {
2631  lcValor = lcValor + ((List<Int16>)loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2632  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2633  }
2634 
2635  //Asigno el valor
2636  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2637 
2638  //Vacio para el siguiente elemento
2639  lcValor = string.Empty;
2640  lnTotalElementos = 0;
2641  break;
2642 
2643  #endregion ListaDeInt16
2644 
2645  #region ListaDeInt32
2646  case "system.collections.generic.list`1[system.int32]":
2647 
2648  //Preparo el nombre
2649  xmlParan.WriteElementString("tipo_param", "INT32:ARRAY");
2650 
2651  //Numero de elementos
2652  lnTotalElementos = ((List<Int32>)loPar).Count;
2653  //Preparo la concatenacion de valores
2654  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2655  {
2656  lcValor = lcValor + ((List<Int32>)loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2657  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2658  }
2659 
2660  //Asigno el valor
2661  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2662 
2663  //Vacio para el siguiente elemento
2664  lcValor = string.Empty;
2665  lnTotalElementos = 0;
2666  break;
2667 
2668  #endregion ListaDeInt32
2669 
2670  #region ListaDeInt64
2671  case "system.collections.generic.list`1[system.int64]":
2672 
2673  //Preparo el nombre
2674  xmlParan.WriteElementString("tipo_param", "INT64:ARRAY");
2675 
2676  //Numero de elementos
2677  lnTotalElementos = ((List<Int64>)loPar).Count;
2678  //Preparo la concatenacion de valores
2679  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2680  {
2681  lcValor = lcValor + ((List<Int64>)loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2682  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2683  }
2684 
2685  //Asigno el valor
2686  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2687 
2688  //Vacio para el siguiente elemento
2689  lcValor = string.Empty;
2690  lnTotalElementos = 0;
2691  break;
2692 
2693  #endregion ListaDeInt64
2694 
2695  #region ListaDeUInt16
2696  case "system.collections.generic.list`1[system.uint16]":
2697 
2698  //Preparo el nombre
2699  xmlParan.WriteElementString("tipo_param", "UINT16:ARRAY");
2700 
2701  //Numero de elementos
2702  lnTotalElementos = ((List<UInt16>)loPar).Count;
2703  //Preparo la concatenacion de valores
2704  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2705  {
2706  lcValor = lcValor + ((List<UInt16>)loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2707  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2708  }
2709 
2710  //Asigno el valor
2711  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2712 
2713  //Vacio para el siguiente elemento
2714  lcValor = string.Empty;
2715  lnTotalElementos = 0;
2716  break;
2717 
2718  #endregion ListaDeUInt16
2719 
2720  #region ListaDeUInt32
2721  case "system.collections.generic.list`1[system.uint32]":
2722 
2723  //Preparo el nombre
2724  xmlParan.WriteElementString("tipo_param", "UINT32:ARRAY");
2725 
2726  //Numero de elementos
2727  lnTotalElementos = ((List<UInt32>)loPar).Count;
2728  //Preparo la concatenacion de valores
2729  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2730  {
2731  lcValor = lcValor + ((List<UInt32>)loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2732  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2733  }
2734 
2735  //Asigno el valor
2736  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2737 
2738  //Vacio para el siguiente elemento
2739  lcValor = string.Empty;
2740  lnTotalElementos = 0;
2741  break;
2742 
2743  #endregion ListaDeUInt32
2744 
2745  #region ListaDeUInt64
2746  case "system.collections.generic.list`1[system.uint64]":
2747 
2748  //Preparo el nombre
2749  xmlParan.WriteElementString("tipo_param", "UINT64:ARRAY");
2750 
2751  //Numero de elementos
2752  lnTotalElementos = ((List<UInt64>)loPar).Count;
2753  //Preparo la concatenacion de valores
2754  for (int lnIndex = 0; lnIndex < lnTotalElementos; lnIndex++)
2755  {
2756  lcValor = lcValor + ((List<UInt64>)loPar)[lnIndex].ToString().Replace(",", ".").Trim();
2757  if (lnIndex != lnTotalElementos - 1) lcValor = lcValor + NETVFP.SEPARADOR;
2758  }
2759 
2760  //Asigno el valor
2761  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2762 
2763  //Vacio para el siguiente elemento
2764  lcValor = string.Empty;
2765  lnTotalElementos = 0;
2766  break;
2767 
2768  #endregion ListaDeUInt64
2769 
2770  #endregion Listas (List<T>)
2771 
2772  #region Listas Ordenadas (SortedList<TKey,TValue>)
2773 
2774  #region SortedList<int,string>
2775  case "system.collections.generic.sortedlist`2[system.int32,system.string]":
2776 
2777  //Preparo el nombre
2778  xmlParan.WriteElementString("tipo_param", "STRING:ARRAY");
2779 
2780  //Numero de elementos
2781  lnTotalElementos = ((SortedList<int, string>)loPar).Count;
2782  //Preparo la concatenacion de valores
2783 
2784  foreach (string lcValorCampo in ((SortedList<int, string>)loPar).Values)
2785  {
2786  lnElementoActual++;
2787  lcValor = lcValor + "'" + lcValorCampo.ToString().Replace("'", "''") + "'";
2788  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
2789  }
2790 
2791  //Asigno el valor
2792  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2793 
2794  //Vacio para el siguiente elemento
2795  lcValor = string.Empty;
2796  lnTotalElementos = 0;
2797  lnElementoActual = 0;
2798  break;
2799 
2800  #endregion SortedList<int,string>
2801 
2802  #region SortedList<int,decimal>
2803  case "system.collections.generic.sortedlist`2[system.int32,system.decimal]":
2804 
2805  //Preparo el nombre
2806  xmlParan.WriteElementString("tipo_param", "DECIMAL:ARRAY");
2807 
2808  //Numero de elementos
2809  lnTotalElementos = ((SortedList<int, decimal>)loPar).Count;
2810  //Preparo la concatenacion de valores
2811  foreach (decimal lcValorCampo in ((SortedList<int, decimal>)loPar).Values)
2812  {
2813  lnElementoActual++;
2814  lcValor = lcValor + lcValorCampo.ToString().Replace(",", ".").Trim();
2815  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
2816  }
2817 
2818  //Asigno el valor
2819  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2820 
2821  //Vacio para el siguiente elemento
2822  lcValor = string.Empty;
2823  lnTotalElementos = 0;
2824  lnElementoActual = 0;
2825  break;
2826 
2827  #endregion SortedList<int,decimal>
2828 
2829  #region SortedList<int,bool>
2830  case "system.collections.generic.sortedlist`2[system.int32,system.boolean]":
2831 
2832  //Preparo el nombre
2833  xmlParan.WriteElementString("tipo_param", "BOOLEAN:ARRAY");
2834 
2835  //Numero de elementos
2836  lnTotalElementos = ((SortedList<int, bool>)loPar).Count;
2837  //Preparo la concatenacion de valores
2838  foreach (bool lcValorCampo in ((SortedList<int, bool>)loPar).Values)
2839  {
2840  lnElementoActual++;
2841  if (lcValorCampo) { lcValor = lcValor + ".T."; }
2842  else { lcValor = lcValor + ".F."; }
2843  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
2844  }
2845 
2846  //Asigno el valor
2847  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2848 
2849  //Vacio para el siguiente elemento
2850  lcValor = string.Empty;
2851  lnTotalElementos = 0;
2852  lnElementoActual = 0;
2853  break;
2854 
2855  #endregion SortedList<int,bool>
2856 
2857  #region SortedList<int,DateTime>
2858  case "system.collections.generic.sortedlist`2[system.int32,system.datetime]":
2859 
2860  //Preparo el nombre
2861  xmlParan.WriteElementString("tipo_param", "DATETIME:ARRAY");
2862 
2863  //Numero de elementos
2864  lnTotalElementos = ((SortedList<int, DateTime>)loPar).Count;
2865  //Preparo la concatenacion de valores
2866  foreach (DateTime lcValorCampo in ((SortedList<int, DateTime>)loPar).Values)
2867  {
2868  lnElementoActual++;
2869  lcValor = lcValor + "{^" + lcValorCampo.Year.ToString().Trim() + "-" +
2870  lcValorCampo.Month.ToString().Trim() + "-" +
2871  lcValorCampo.Day.ToString().Trim() + "}";
2872  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
2873  }
2874 
2875  //Asigno el valor
2876  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2877 
2878  //Vacio para el siguiente elemento
2879  lcValor = string.Empty;
2880  lnTotalElementos = 0;
2881  lnElementoActual = 0;
2882  break;
2883 
2884  #endregion SortedList<int,DateTime>
2885 
2886  #region SortedList<int,double>
2887  case "system.collections.generic.sortedlist`2[system.int32,system.double]":
2888 
2889  //Preparo el nombre
2890  xmlParan.WriteElementString("tipo_param", "DOUBLE:ARRAY");
2891 
2892  lnTotalElementos = ((SortedList<int, double>)loPar).Count;
2893  //Preparo la concatenacion de valores
2894  foreach (double lcValorCampo in ((SortedList<int, double>)loPar).Values)
2895  {
2896  lnElementoActual++;
2897  lcValor = lcValor + lcValorCampo.ToString().Replace(",", ".").Trim();
2898  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
2899  }
2900 
2901  //Asigno el valor
2902  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2903 
2904  //Vacio para el siguiente elemento
2905  lcValor = string.Empty;
2906  lnTotalElementos = 0;
2907  lnElementoActual = 0;
2908  break;
2909 
2910  #endregion SortedList<int,double>
2911 
2912  #region SortedList<int,Int16>
2913  case "system.collections.generic.sortedlist`2[system.int32,system.int16]":
2914 
2915  //Preparo el nombre
2916  xmlParan.WriteElementString("tipo_param", "INT16:ARRAY");
2917 
2918  //Numero de elementos
2919  lnTotalElementos = ((SortedList<int, Int16>)loPar).Count;
2920  //Preparo la concatenacion de valores
2921  foreach (Int16 lcValorCampo in ((SortedList<int, Int16>)loPar).Values)
2922  {
2923  lnElementoActual++;
2924  lcValor = lcValor + lcValorCampo.ToString().Replace(",", ".").Trim();
2925  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
2926  }
2927 
2928  //Asigno el valor
2929  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2930 
2931  //Vacio para el siguiente elemento
2932  lcValor = string.Empty;
2933  lnTotalElementos = 0;
2934  lnElementoActual = 0;
2935  break;
2936 
2937  #endregion SortedList<int,Int16>
2938 
2939  #region SortedList<int,Int32>
2940  case "system.collections.generic.sortedlist`2[system.int32,system.int32]":
2941 
2942  //Preparo el nombre
2943  xmlParan.WriteElementString("tipo_param", "INT32:ARRAY");
2944 
2945  //Numero de elementos
2946  lnTotalElementos = ((SortedList<int, Int32>)loPar).Count;
2947  //Preparo la concatenacion de valores
2948  foreach (Int32 lcValorCampo in ((SortedList<int, Int32>)loPar).Values)
2949  {
2950  lnElementoActual++;
2951  lcValor = lcValor + lcValorCampo.ToString().Replace(",", ".").Trim();
2952  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
2953  }
2954 
2955  //Asigno el valor
2956  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2957 
2958  //Vacio para el siguiente elemento
2959  lcValor = string.Empty;
2960  lnTotalElementos = 0;
2961  lnElementoActual = 0;
2962  break;
2963 
2964  #endregion SortedList<int,Int32>
2965 
2966  #region SortedList<int,Int64>
2967  case "system.collections.generic.sortedlist`2[system.int32,system.int64]":
2968 
2969  //Preparo el nombre
2970  xmlParan.WriteElementString("tipo_param", "INT64:ARRAY");
2971 
2972  //Numero de elementos
2973  lnTotalElementos = ((SortedList<int, Int64>)loPar).Count;
2974  //Preparo la concatenacion de valores
2975  foreach (Int64 lcValorCampo in ((SortedList<int, Int64>)loPar).Values)
2976  {
2977  lnElementoActual++;
2978  lcValor = lcValor + lcValorCampo.ToString().Replace(",", ".").Trim();
2979  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
2980  }
2981 
2982  //Asigno el valor
2983  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
2984 
2985  //Vacio para el siguiente elemento
2986  lcValor = string.Empty;
2987  lnTotalElementos = 0;
2988  lnElementoActual = 0;
2989  break;
2990 
2991  #endregion SortedList<int,Int64>
2992 
2993  #region SortedList<int,UInt16>
2994  case "system.collections.generic.sortedlist`2[system.int32,system.uint16]":
2995 
2996  //Preparo el nombre
2997  xmlParan.WriteElementString("tipo_param", "UINT16:ARRAY");
2998 
2999  //Numero de elementos
3000  lnTotalElementos = ((SortedList<int, UInt16>)loPar).Count;
3001  //Preparo la concatenacion de valores
3002  foreach (UInt16 lcValorCampo in ((SortedList<int, UInt16>)loPar).Values)
3003  {
3004  lnElementoActual++;
3005  lcValor = lcValor + lcValorCampo.ToString().Replace(",", ".").Trim();
3006  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
3007  }
3008 
3009  //Asigno el valor
3010  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
3011 
3012  //Vacio para el siguiente elemento
3013  lcValor = string.Empty;
3014  lnTotalElementos = 0;
3015  lnElementoActual = 0;
3016  break;
3017 
3018  #endregion SortedList<int,UInt16>
3019 
3020  #region SortedList<int,UInt32>
3021  case "system.collections.generic.sortedlist`2[system.int32,system.uint32]":
3022 
3023  //Preparo el nombre
3024  xmlParan.WriteElementString("tipo_param", "UINT32:ARRAY");
3025 
3026  //Numero de elementos
3027  lnTotalElementos = ((SortedList<int, UInt32>)loPar).Count;
3028  //Preparo la concatenacion de valores
3029  foreach (UInt32 lcValorCampo in ((SortedList<int, UInt32>)loPar).Values)
3030  {
3031  lnElementoActual++;
3032  lcValor = lcValor + lcValorCampo.ToString().Replace(",", ".").Trim();
3033  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
3034  }
3035 
3036  //Asigno el valor
3037  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
3038 
3039  //Vacio para el siguiente elemento
3040  lcValor = string.Empty;
3041  lnTotalElementos = 0;
3042  lnElementoActual = 0;
3043  break;
3044 
3045  #endregion SortedList<int,UInt32>
3046 
3047  #region SortedList<int,UInt64>
3048  case "system.collections.generic.sortedlist`2[system.int32,system.uint64]":
3049 
3050  //Preparo el nombre
3051  xmlParan.WriteElementString("tipo_param", "UINT64:ARRAY");
3052 
3053  //Numero de elementos
3054  lnTotalElementos = ((SortedList<int, UInt64>)loPar).Count;
3055  //Preparo la concatenacion de valores
3056  foreach (UInt64 lcValorCampo in ((SortedList<int, UInt64>)loPar).Values)
3057  {
3058  lnElementoActual++;
3059  lcValor = lcValor + lcValorCampo.ToString().Replace(",", ".").Trim();
3060  if (lnElementoActual != lnTotalElementos) lcValor = lcValor + NETVFP.SEPARADOR;
3061  }
3062 
3063  //Asigno el valor
3064  xmlParan.WriteElementString("parametros", lcValor.ToString().Trim());
3065 
3066  //Vacio para el siguiente elemento
3067  lcValor = string.Empty;
3068  lnTotalElementos = 0;
3069  lnElementoActual = 0;
3070  break;
3071 
3072  #endregion SortedList<int,UInt64>
3073 
3074  #endregion Listas Ordenadas (SortedList<TKey,TValue>)
3075 
3076  default: //Tratamiento parametros ordinarios (tipos simples)
3077 
3078  //Tipo parametros
3079  xmlParan.WriteElementString("tipo_param", lcTipo.ToString().Trim().ToUpper().Substring(7));
3080  //Valor
3081  xmlParan.WriteElementString("parametros", _ToString(loPar));
3082  break;
3083 
3084  }
3085 
3086  xmlParan.WriteEndElement(); //cierro nombre cursor
3087 
3088  }
3089 
3090  }
3091 
3092  xmlParan.WriteEndElement(); //Cierro VFPData
3093  xmlParan.WriteEndDocument();
3094  xmlParan.Close();
3095 
3096  }
3097 
3098  return lcNombreFichero;
3099 
3100  }
3101 
3102 
3106  private static void GuardarFicheroXmlRespuesta(string tcRutaFicheroXml, string[] tcValores)
3107  {
3108  // Crear xml con la respuesta para fox
3109  XmlDocument xmlReturn = new XmlDocument();
3110  xmlReturn.LoadXml("<?xml version = \"1.0\" encoding=\"Windows-1252\" standalone=\"yes\"?><returnvalues> </returnvalues>");
3111  XmlNode loNodeA = xmlReturn.SelectSingleNode("returnvalues");
3112 
3113  // Añadir los valores de respuesta al fichero
3114  foreach (string lcValor in tcValores)
3115  {
3116  XmlNode loNode = xmlReturn.CreateElement("return");
3117  loNode.InnerText = lcValor;
3118  loNodeA.AppendChild(loNode);
3119  }
3120 
3121  // Guardar xml
3122  xmlReturn.PreserveWhitespace = true;
3123  xmlReturn.Save(tcRutaFicheroXml);
3124  }
3125 
3126  #endregion METODOS PRIVADOS
3127  }
3128 
3129 }
Boolean _Show_Gestion_Accesos(String tcPantalla, string tcDescripcion="")
PE-86721 Este método presentará el formulario de Gestión de Accesos. PE-90297: añadimos el parámetro ...
Definition: clsUsuario.cs:6802
Interficie del gestor de ficheros o365
static string GenerarChecksumOpciones(string tcOpcion, string tcSalt)
PE-102978: Generar una función hash segura a partir de una opción y un salt
static AddonsController Instance
Instancia al objeto singleton Addons
bool _Revisar_Connect_Formulario(FormBase toForm)
Método para revisar la tabla connect, actualizar los campos PROGRAMA y MODULO y realizar control de u...
Definition: clsUsuario.cs:4998
static sage.ew.usuario.Usuario _This
Instancia estática del objeto usuario con los datos del usuario actual (wc_usuario) ...
Definition: clsUsuario.cs:341
Argumentos para los eventos lanzados por el addons en caso de error
bool _CargarAddOns(FunctionsDependencies loFuntionsDependencies)
Carga addons
Clase base para añadir el formulario de "Listas previas" como Widget en en escritorio (FormTabs) ...
bool _UploadFile(string tcPathOriginal, string tcPathDestination)
Sube un fichero a O365
bool _Acceso_Pantalla(string tcPantalla, _TiposAccesosPantalla tnTipoAcceso, bool tlTodosEjercicios=false, string tcEmpresa="")
Metodo que nos actualizará el acceso el titpo de acceso a una pantalla para este usuario ...
Definition: clsUsuario.cs:3305
Clase Singleton para la carga de los diccionarios
PE-85105: Clase donde se implementaran aquellas funciones de encriptación y desencriptación utilizand...
Definition: Criptografia.cs:15
override void _Load()
Load
Definition: clsUsuario.cs:5369
void _CrearTareaAutomatica(string tcTaskName, string tcTaskDescription, string tcPantalla, List< bool > lstDiasSemana=null, string tcHorasMinutos="", List< string > lstParametrosExtra=null, bool tbSilentModeOnOk=false, Usuario toUsuario=null, bool tlSystemUser=true, int tnIntervalo=0)
Crea una tarea automatica DAILY con nombre tcTaskName para la ejecución de la pantalla tcPantalla PE-...
Definition: clsUsuario.cs:6905
static bool CargarDiccionarios(string tcempresa, string tcCajaTpv)
A partir de un código de empresa y un código de caja nos carga las variables de empresa, mascaras, anchuras de campos standar y de TPV
Clase para uso de funciones genéricas
Definition: functions.cs:146
eTiposDocumentoImpresionMasiva
Tipos de documento para impresion masiva de desde FOX
Definition: functions.cs:93
IAddonsManager AddonsManager
Gestor de Addons
bool _OpenAndSavePath(string tcPathDestino, short tnTipo)
Abre un FolderDialog y guarda la selección del usuario en el path pasado por parémetros ...
_TiposAccesosPantalla _Acceso(string tcNombrePantalla, bool tbIgnorarHera=false)
Método que nos devolverá un entero con la siguiente información:
Definition: clsUsuario.cs:1798
void _Show_Favoritos(string tcPantalla, string tcDescripcio="")
PE-87840: método para mostrar la pantalla de favoritos
Definition: clsUsuario.cs:7104
Definición de la clase Usuario
Definition: clsUsuario.cs:113