/// <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);
        }
Example #2
0
        /// <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);
                        }
                    }
                }
            }
        }