/// <summary> /// Carga los datos de una sentencia <see cref="SentenceForEach"/> /// </summary> private SentenceBase LoadSentenceForEach(MLNode rootML, string pathBase) { SentenceForEach sentence = new SentenceForEach(); // Carga los datos de la sentencia sentence.Source = rootML.Attributes[TagSource].Value; sentence.Command = GetProviderCommand(rootML, TagProviderCommand); // Carga las instrucciones a ejecutar cuando hay o no hay datos foreach (MLNode nodeML in rootML.Nodes) { switch (nodeML.Name) { case TagEmptyData: sentence.SentencesEmptyData.AddRange(LoadSentences(nodeML.Nodes, pathBase)); break; case TagWithData: sentence.SentencesWithData.AddRange(LoadSentences(nodeML.Nodes, pathBase)); break; } } // Devuelve la sentencia return(sentence); }
/// <summary> /// Ejecuta una sentencia foreach /// </summary> private void ExecuteForEach(SentenceForEach sentence) { using (BlockLogModel block = Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, "Start for each")) { ProviderModel provider = GetProvider(sentence.Source); if (provider == null) { AddError($"Can't find provider {sentence.Source}"); } else { CommandModel command = ConvertProviderCommand(sentence.Command, out string error); if (!string.IsNullOrWhiteSpace(error)) { AddError($"Error when convert command. {error}"); } else { int startRow = 0; // Ejecuta la consulta sobre el proveedor try { foreach (DataTable table in GetDataTable(provider, command)) { if (table.Rows.Count > 0) { // Ejecuta las instrucciones foreach (DataRow row in table.Rows) { // Crea un contexto Context.Add(); // Añade el índice de fila a la lista de variables Context.Actual.VariablesTable.Add("RowIndex", startRow + table.Rows.IndexOf(row)); // Añade las columnas for (int index = 0; index < table.Columns.Count; index++) { if (row.IsNull(index) || row[index] == null) { Context.Actual.VariablesTable.Add(table.Columns[index].ColumnName, null); } else { Context.Actual.VariablesTable.Add(table.Columns[index].ColumnName, row[index]); } } // Ejecuta las sentencias Execute(sentence.SentencesWithData); // Limpia el contexto Context.Pop(); } // Añade el total de filas startRow += table.Rows.Count; } } } catch (Exception exception) { AddError($"Error when load data. {exception.Message}"); } // Si no se han encontrado datos, ejecuta las sentencias adecuadas if (startRow == 0) { Execute(sentence.SentencesEmptyData); } } } } }