BrowserData.cs
1 using sage.ew.db;
2 using System;
3 using System.Collections.Generic;
4 using System.ComponentModel;
5 using System.Data;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 
10 namespace Sage.ES.S50.Browser
11 {
15  internal class BrowserData:sage.ew.interficies.IBrowserData
16  {
17  #region Camps privats
18 
19  private string _cSelect = "";
20  private string ultimaConsulta;
21  long registrosleidos = 0;
22 
23  // Objeto para la lectura por lotes
24  BatchDataReader batchdatareader = new BatchDataReader();
25 
26  #endregion Camps privats
27 
28 
29 
30  #region Propietades
31 
32  private string _cTabla;
36  public string _Tabla
37  {
38  get { return _cTabla; }
39  set
40  {
41  _cTabla = value;
42  }
43  }
44 
45  private string _cGroupBy = "";
50  public string _GroupBy
51  {
52  get { return _cGroupBy; }
53  set { _cGroupBy = value; }
54  }
55 
56  private string _cOrderBy;
61  public string _OrderBy
62  {
63  get { return _cOrderBy; }
64  set { _cOrderBy = value; }
65  }
66 
67  private string _cCampo_Predet;
72  public string _Campo_Predet
73  {
74  get { return _cCampo_Predet; }
75  set { _cCampo_Predet = value; }
76  }
77 
78  private string _cCampos;
82  public string _Campos
83  {
84  get { return _cCampos; }
85  set { _cCampos = value; }
86  }
87 
88  private string _cCondicion;
92  public string _Condicion
93  {
94  get { return _cCondicion; }
95  set { _cCondicion = value; }
96  }
97 
98  private string _cClave;
102  public string _Clave
103  {
104  get { return _cClave; }
105  set { _cClave = value; }
106  }
107 
108  private string _cDataBase;
112  public string _DataBase
113  {
114  get { return _cDataBase; }
115  set { _cDataBase = value; }
116  }
117 
118  private Dictionary<string, object> _cCodigo;
122  public Dictionary<string, object> _Codigo
123  {
124  get { return _cCodigo; }
125  set { _cCodigo = value; }
126  }
127 
131  [Description("Muestra en modo 'Browser' el Datatable"), DefaultValue(null)]
132  public DataTable _DatatablePersonalizado
133  {
134  get { return _dtDatatablePersonalizado; }
135  set
136  {
137  _dtDatatablePersonalizado = value;
138  }
139  }
140  private DataTable _dtDatatablePersonalizado = null;
141 
142  private string _cConsultaPersonalizada = "";
146  public string _ConsultaPersonalizada
147  {
148  get { return _cConsultaPersonalizada; }
149  set
150  {
151  _cConsultaPersonalizada = value;
152  }
153  }
154 
155  private DataTable resultado = null;
159  public DataTable _Resultado
160  {
161  get
162  {
163  return resultado;
164  }
165  set { resultado = value; }
166  }
167 
168  private bool _cSeleccion_Multiple = false;
172  public bool _Seleccion_Multiple
173  {
174  get { return _cSeleccion_Multiple; }
175  set { _cSeleccion_Multiple = value; }
176  }
177 
178  #endregion
179 
180 
181  #region Mètodes públics
182 
183  public void _Execute()
184  {
185  ExecutaConsulta();
186  }
187 
188  #endregion Mètodes públics
189 
190  private void ExecutaConsulta()
191  {
192  bool tbSoloEstructura = false;
193  string tcFiltro = "";
194  bool force = false;
195  string sortcolumn = "";
196  bool consultalistado = false;
197  bool canviarordre = true;
198 
199 
200 
201 
202  DataTable ldtResultado = new DataTable();
203 
204 
205  string sqlresultados = string.Empty;
206  string sqloriginal = string.Empty;
207  string lcFrom = string.Empty;
208  string lcWhere = string.Empty;
209  string lcOrderBy = string.Empty;
210  string lcGroupBy = string.Empty;
211 
212 
213  //Console.WriteLine(String.Format("{0:00}:{1:00}:{2:00}.{3:00}", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond / 10) + " - Browser.ExecutaConsulta (inici)");
214  //Stopwatch stopWatch = new Stopwatch();
215  //stopWatch.Start();
216 
217  if (_DatatablePersonalizado == null)
218  {
219  // PE-95408. Si se ha pasada consulta personalizada, la utilizamos
220  if (!string.IsNullOrWhiteSpace(_ConsultaPersonalizada))
221  {
222  sqloriginal = AnalizeSql(_ConsultaPersonalizada);
223  }
224  else
225  {
226  sqloriginal = MountSql();
227  }
228 
229 
231  //if (_dtGrid == null || _dtGrid.Rows.Count == 0 || tcFiltro != _cFiltro || force)
232  //{
233  // lcWhere = "";
234  // _cFiltro = tcFiltro;
235 
236  // if (tbSoloEstructura)
237  // lcWhere = " Where 1 = 0";
238  // else
239  // {
240  if (!string.IsNullOrWhiteSpace(tcFiltro))
241  {
242  //if (!string.IsNullOrWhiteSpace(lcWhere))
243  // lcWhere = lcWhere + " And ";
244  lcWhere = lcWhere + " Where " + tcFiltro;
245  }
246  // }
247 
248  // Montem la consulta del resultat
249  sqlresultados = "Select ";//Top " + maxregistros.ToString() + " ";
250  if (_Seleccion_Multiple)
251  {
252  sqlresultados += DB.SQLFalse() + " as selected, ";
253  }
254  sqlresultados += "* From (";
255  sqlresultados += sqloriginal;
256  sqlresultados += ") as sqlresult ";
257  sqlresultados += lcWhere;
258 
259  // Sólo ordenamos el resultado con datos
260  if (!tbSoloEstructura)
261  {
262  //if (!String.IsNullOrEmpty(_CondicionAutomatica))
263  //{
264  // canviarordre = false;
265  // sortedcolumn = sortcolumn = !this._Clave.Contains(",") ? this._Clave : (this._Clave.Contains(",") && this._Clave.Split(',').Where(f => f.ToLower() == "codigo").Count() > 0) ? "CODIGO" : "";
266  //}
267 
268  if (string.IsNullOrWhiteSpace(sortcolumn))
269  {
270  //if (timerexecutaconsulta._Selcol > 0)
271  //{
272  // sortcolumn = timerexecutaconsulta._Selcol.ToString();
273  // canviarordre = false;
274  //}
275  }
276 
277  // Si no hay que ordenar por columna
278  if (string.IsNullOrWhiteSpace(sortcolumn))
279  {
280  //sortedcolumn = "";
281 
282  // Order by
283  if (!string.IsNullOrWhiteSpace(lcOrderBy))
284  {
285  string orderby = "";
286  string coma = "";
287 
288  // Agafem els camps per saber la posició dels camps de l'order by
289  string[] aliascamps = _cSelect.Split(',');
290 
291  // Treure els alias
292  string[] orderbycamps = lcOrderBy.Split(',');
293  foreach (string orderbycamp in orderbycamps)
294  {
295  string lowercamp = orderbycamp.ToLower().Trim();
296  string orderbyascdesc = "";
297 
298  if (lowercamp.Contains(" desc"))
299  {
300  orderbyascdesc = " desc ";
301  lowercamp = lowercamp.Replace(" desc", "");
302  }
303 
304  if (lowercamp.Contains(" asc"))
305  {
306  orderbyascdesc = " asc ";
307  lowercamp = lowercamp.Replace(" asc", "");
308  }
309 
310  // Busco la posició del camp order dins del select
311  int poscamporderby = -1;
312  for (int i = 0; i < aliascamps.Length; i++)
313  {
314  string loweralias = aliascamps[i].ToLower().Trim();
315 
316  if (loweralias.Contains(lowercamp))
317  {
318  poscamporderby = i + 1;
319  break;
320  }
321  }
322 
323  if (poscamporderby > -1)
324  {
325  orderby += coma + poscamporderby.ToString() + orderbyascdesc;
326 
327  coma = ", ";
328  }
329  else
330  {
331  // Bug 132053. Si el campo del order by no está en el resultado de la consulta, no lo usamos.
332  //int pospunt = orderbycamp.IndexOf('.');
333  //if (pospunt != -1)
334  //{
335  // orderby += coma + orderbycamp.Substring(pospunt + 1);
336  //}
337  //else
338  //{
339  // orderby += coma + orderbycamp;
340  //}
341 
342  //coma = ", ";
343  }
344 
345  }
346 
347  sortcolumn = orderby;
348  //sqlresultados += " Order by " + orderby;
349  }
350  }
351 
352  if (!string.IsNullOrWhiteSpace(sortcolumn))
353  {
354  // Forzamos el orden del encabezado de columna
355  if (canviarordre)
356  {
357  //if (sortedcolumn == sortcolumn && (!sortcolumn.Contains(" Desc ") || sortcolumn.Length > 6 && sortcolumn.Trim().ToLower().Substring(sortcolumn.Trim().Length - 4) != "desc") && !consultalistado)
358  //{
359  // sortcolumn += " Desc ";
360  //}
361  //else
362  //{
363  // if (sortcolumn.Length > 6 && sortcolumn.Trim().ToLower().Substring(sortcolumn.Trim().Length - 4) == "desc")
364  // {
365  // sortcolumn = sortcolumn.Substring(0, sortcolumn.Length - 6);
366  // }
367  //}
368  }
369  else
370  {
371  //sortcolumn = sortedcolumn;
372  }
373 
374  // CCR 154358. Si no hay sortcolumn, no añadir Order by
375  if (!string.IsNullOrWhiteSpace(sortcolumn))
376  {
377  sqlresultados += " Order by " + sortcolumn;
378  }
379  }
380 
381  //sortedcolumn = sortcolumn;
382  }
383 
384  canviarordre = true;
385 
386  // CCR 137276. Si s'ha de mostrar llistat, excel... agafem tots els registres tenint en compte els filtres
387  if (consultalistado)
388  {
389  // Executem
390  DB.SQLExec(sqlresultados, ref ldtResultado);
391  }
392  else
393  {
394  //Procesar_Resultados_Seleccion_Multiple();
395 
396  ultimaConsulta = sqlresultados;
397 
398  batchdatareader._MaxResults = 100;
399  batchdatareader._Sqlquery = sqlresultados;
400  batchdatareader._Read();
401 
402  if (!string.IsNullOrWhiteSpace(batchdatareader._Error_Message))
403  {
404  sage.ew.functions.FUNCTIONS._MessageBox("Se han producido incidencias en la ejecución de la consulta SQL." + Environment.NewLine +
405  "Se mostrarán los datos de la configuración original." + Environment.NewLine + Environment.NewLine +
406  "Incidencias:" + Environment.NewLine + batchdatareader._Error_Message, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, DialogResult.OK);
407 
408  // Si hay consulta personalizada, la sacamos para que muestre el resultado original
409  if (!string.IsNullOrWhiteSpace(_ConsultaPersonalizada))
410  {
411  _ConsultaPersonalizada = "";
412  _cSelect = "";
413  ExecutaConsulta();
414  }
415  }
416 
417  ldtResultado = batchdatareader._Resultados;
418  registrosleidos = batchdatareader._RowsRead;
419 
420  // Si se ha incluido la columna selected, hay que sacarle el readonly
421  if (_Seleccion_Multiple)
422  {
423  ldtResultado.Columns["selected"].ReadOnly = false;
424  }
425 
426  //Marcar_Seleccion_Multiple();
427  }
428  //}
429  //else
430  //{
431  // // Si no ha cambiado nada en la consulta, devolvemos el mismo datatable
432  // return _dtGrid;
433  //}
434  }
435  else
436  {
437  // Si hay un DataTable personalizado, devolvemos el mismo datatable
438  ldtResultado = _DatatablePersonalizado;
439  }
440 
441  //stopWatch.Stop();
442  //TimeSpan ts = stopWatch.Elapsed;
443  //Console.WriteLine(String.Format("{0:00}:{1:00}:{2:00}.{3:00}", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond / 10) + " - Browser.ExecutaConsulta (final) " + String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10));
444 
445  //this.ewcheckboxSelTodosCap.Checked = false;
446 
447  _Resultado = ldtResultado;
448  }
449 
450  private string AnalizeSql(string consultapersonalizada)
451  {
452  string sqloriginal = consultapersonalizada;
453  string lcFrom = string.Empty;
454  string lcWhere = string.Empty;
455  string lcOrderBy = string.Empty;
456  string lcGroupBy = string.Empty;
457 
458  // N'agafem les diferents parts
459  int lnPosSelect = consultapersonalizada.ToLower().IndexOf("select", StringComparison.OrdinalIgnoreCase);
460  int lnPosFrom = consultapersonalizada.ToLower().IndexOf("from", StringComparison.OrdinalIgnoreCase);
461  int lnPosWhere = consultapersonalizada.ToLower().LastIndexOf("where", StringComparison.OrdinalIgnoreCase);
462  int lnPosGroupBy = consultapersonalizada.ToLower().LastIndexOf("group by", StringComparison.OrdinalIgnoreCase);
463  int lnPosOrderBy = consultapersonalizada.ToLower().LastIndexOf("order by", StringComparison.OrdinalIgnoreCase);
464 
465 
466  // El select només lo montem una vegada
467  if (string.IsNullOrWhiteSpace(_cSelect))
468  {
469  // Select fins al From
470  _cSelect = consultapersonalizada.Substring(lnPosSelect + 6, lnPosFrom - (lnPosSelect + 6));
471 
472  // Busco els noms del camps per utilitzarlos als filtres
473  int lnPosAs = 0;
474  //int lnPosComa = 0;
475  int lnLenAs = 0;
476  int lnPosPunt = 0;
477 
478  string lcSelect = _cSelect;
479  string lcamp = "";
480  string lcAlias = "";
481 
482  do
483  {
484  // Pot ser que el camp no tingui alias
485  lnPosAs = lcSelect.ToLower().IndexOf(" as ");
486  //lnPosComa = lcSelect.IndexOf(",");
487 
489  //if (lnPosAs == -1 || (lnPosComa > 0 && lnPosAs > lnPosComa))
490  //{
491  // lnPosAs = lnPosComa;
492  // lnLenAs = 2;
493  //}
494  //else
495  //{
496  lnLenAs = 3;
497  //}
498 
499  if (lnPosAs != -1)
500  {
501  // la part esquerra és el camp o l'expressió
502  lcAlias = lcSelect.Substring(0, lnPosAs).Trim();
503 
504  if (lnLenAs != 2)
505  {
506  lcSelect = lcSelect.Substring(lnPosAs + lnLenAs).Trim();
507  }
508 
509  // busquem la coma per al
510  lnPosAs = lcSelect.IndexOf(",");
511  if (lnPosAs == -1)
512  lcamp = lcSelect.Substring(0).Trim();
513  else
514  {
515  lcamp = lcSelect.Substring(0, lnPosAs).Trim();
516  lcSelect = lcSelect.Substring(lnPosAs + 1).Trim();
517  }
518 
519  // És possible que al lcCamp li hagi quedat el alias de la taula
520  lnPosPunt = lcamp.IndexOf(".");
521  if (lnPosPunt != -1)
522  {
523  lcamp = lcamp.Substring(lnPosPunt + 1).Trim();
524  }
525 
526  //_cAliasCamps.Add(lcamp, lcAlias);
527  }
528 
529  } while (lnPosAs != -1);
530  }
531 
532  // El From arribarà fins la primera clausula que tingui la consulta
533  if (lnPosWhere != -1)
534  lcFrom = consultapersonalizada.Substring(lnPosFrom + 4, lnPosWhere - (lnPosFrom + 4));
535  else if (lnPosGroupBy != -1)
536  lcFrom = consultapersonalizada.Substring(lnPosFrom + 4, lnPosGroupBy - (lnPosFrom + 4));
537  else if (lnPosOrderBy != -1)
538  lcFrom = consultapersonalizada.Substring(lnPosFrom + 4, lnPosOrderBy - (lnPosFrom + 4));
539  else
540  lcFrom = consultapersonalizada.Substring(lnPosFrom + 4);
541 
542  // El Where. Que també fins la propera clausula que tingui la consulta
543  if (lnPosWhere != -1)
544  {
545  if (lnPosGroupBy != -1)
546  lcWhere = consultapersonalizada.Substring(lnPosWhere + 6, lnPosGroupBy - (lnPosWhere + 6));
547  else if (lnPosOrderBy != -1)
548  lcWhere = consultapersonalizada.Substring(lnPosWhere + 6, lnPosOrderBy - (lnPosWhere + 6));
549  else
550  lcWhere = consultapersonalizada.Substring(lnPosWhere + 6);
551 
552  // PE-104293. Si hay where ponemos parentesis por si hay algun Or
553  if (!string.IsNullOrWhiteSpace(lcWhere))
554  {
555  lcWhere = "(" + lcWhere + ")";
556  }
557  }
558 
559  // El Group By. Que també fins la propera clausula que tingui la consulta
560  if (lnPosGroupBy != -1)
561  {
562  if (lnPosOrderBy != -1)
563  lcGroupBy = consultapersonalizada.Substring(lnPosGroupBy + 8, lnPosOrderBy - (lnPosGroupBy + 8));
564  else
565  lcGroupBy = consultapersonalizada.Substring(lnPosGroupBy + 8);
566  }
567 
568  // El Order By sempres ha de ser l'últim
569  if (lnPosOrderBy != -1)
570  {
571  lcOrderBy = consultapersonalizada.Substring(lnPosOrderBy + 8);
572  sqloriginal = sqloriginal.Substring(0, lnPosOrderBy - 1);
573  }
574 
575  return sqloriginal;
576  }
577 
578  private string MountSql()
579  {
580  string sqloriginal = string.Empty;
581  string lcFrom = string.Empty;
582  string lcWhere = string.Empty;
583  string lcOrderBy = string.Empty;
584  string lcGroupBy = string.Empty;
585  string lcCampos_No_Visibles = string.Empty;
586 
587  // Select
588  if (string.IsNullOrWhiteSpace(_cSelect))
589  {
590  // Si tenemos campos no visibles
591  //if (string.IsNullOrWhiteSpace(this._cCampos_No_Visibles) == false)
592  //{
593  // // solo añadiremos los que no están en _cCampos
594  // string[] campsnovisibles = this._Campos_No_Visibles.ToLower().Split(',');
595  // string[] campos = this._cCampos.ToLower().Split(',');
596 
597  // foreach (string campnovisible in campsnovisibles)
598  // {
599  // if (!campos.Contains(campnovisible))
600  // {
601  // // Agregamos la coma para posteriormente poder añadir el resto de campos
602  // lcCampos_No_Visibles += "," + campnovisible;
603  // }
604  // }
605  //}
606 
607  _cSelect = this._cCampos + lcCampos_No_Visibles;// + this._cCampsAgregats;
608  }
609 
610  // From
611  lcFrom = DB.SQLDatabase(this._cDataBase, this._cTabla);
612 
613  // Where
614  if (!string.IsNullOrWhiteSpace(this._cCondicion))
615  lcWhere = this._cCondicion;
616 
617  // Group by
618  if (!string.IsNullOrWhiteSpace(_cGroupBy))
619  lcGroupBy = _cGroupBy;
620 
621  // Order
622  if (!string.IsNullOrWhiteSpace(_cOrderBy))
623  lcOrderBy = _cOrderBy;
624  else if (!string.IsNullOrWhiteSpace(_cCampo_Predet))
625  lcOrderBy = _cCampo_Predet;
626 
627  sqloriginal = "Select ";
628  sqloriginal += _cSelect;
629  sqloriginal += " From " + lcFrom;
630  sqloriginal += !string.IsNullOrWhiteSpace(lcWhere) ? " Where " + lcWhere : "";
631  sqloriginal += !string.IsNullOrWhiteSpace(lcGroupBy) ? " Group By " + lcGroupBy : "";
632  //sqloriginal += !string.IsNullOrWhiteSpace(lcOrderBy) ? " Order By " + lcOrderBy : "";
633 
634  return sqloriginal;
635  }
636  }
637 }
Int64 _MaxResults
Número máximo de registros que se recuperarán en cada petición
Int64 _Read(bool allrows=false)
Ejecuta la consulta y rellena el _Resultado con el primer lote
DataTable _Resultados
Datatable con el conjunto de resultados
string _Sqlquery
Consulta Sql
Int64 _RowsRead
Posición del último registro leido
string _Error_Message
Último mensaje de error
Clase para uso de funciones genéricas
Definition: functions.cs:146
Clase para la obtención de datos por lotes