TaxForms в АС Бюджет

Все вопросы по АС Бюджет
Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

TaxForms в АС Бюджет

Сообщение Val » 31.03.2009 13:40

пока тест
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 02.04.2009 08:45

Выгнал в отчет все коды (не КД, а коды типа 30100, 30200 и т.д).
Делается около 2 мин.
У меня страшний код равен сумме младших, а в TaxForms не всегда. Кто то неправ :-)
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 02.04.2009 11:48

Цель: Загрузить данные налоговой (те что сейчас обрабатываются программой TaxForms) в АС Бюджет и сделать отчеты для вывода.
Все делается по минимуму для отработки технологии.

1. Создаем таблицу в базе АС Бюджет.

Код: Выделить всё

SET NAMES WIN1251;
CREATE GENERATOR GEN_VAL_TAX_ID;
CREATE TABLE VAL_TAX (
    ID       ID /* ID = INTEGER NOT NULL */,
    OKATO    VARCHAR(11) DEFAULT 0 NOT NULL COLLATE PXW_CYRL,
    STATUS   CLS DEFAULT 0 /* CLS = INTEGER NOT NULL */,
    KDVALUE  NOTE20 /* NOTE20 = VARCHAR(20) */,
    KOD      INTEGER DEFAULT 0 NOT NULL,
    SUMMA    MONEY32 DEFAULT 0 NOT NULL /* MONEY32 = NUMERIC(15,2) default 0 */
);
SET TERM ^ ;
/* Trigger: VAL_TAX_BI */
CREATE TRIGGER VAL_TAX_BI FOR VAL_TAX
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_val_tax_id,1);
end
^
SET TERM ; ^
/* Privileges of users */
GRANT ALL ON VAL_TAX TO PUBLIC;


2. Перегоняем файлы налоговой в такой вид, чтоб они подлежали загрузке в таблицу обычными методами. Я делаю это perl скриптом.

Код: Выделить всё

# Конвертер Tax в реляционный формат для загрузки в базу
# версия 1.0
# требует наличия:
# Val 26032009
use strict;
use Log::Log4perl;
   Log::Log4perl::init("log.conf");
   my $log = Log::Log4perl::get_logger("main");
use Cwd;
my ($fname_dir,$fname_in,$fname_out);
$fname_dir =  getcwd; # имя текущего каталога
$fname_in = shift @ARGV; # первый аргумент - имя файла для обработки
$fname_out = shift @ARGV; # второй аргумент - имя файла для записи
$log->debug("файл для чтения : $fname_in");
$log->debug("файл для записи : $fname_out");

my @b;
open(FF,$fname_in) || $log->logdie("не могу открыть фалй для чтения : $!");
open(FF1,'>'.$fname_out) || $log->logdie("не могу открыть файл для записи : $!");
my @a = <FF>;
chomp(@a);
close(FF) || $log->logwarn("не могу закрыть файл открытый для чтения $_");;
my $i=10;
my $j=0;
while ($a[$i] ne '===') {
   print "начинаем обработку документа на строке $i\n"; 
   $log->debug("запускаем анализ документа со строки $i"); 
   $i = analiz_doc($i);
   $log->debug("окончили анализ докумета на строке $i");
   $log->debug("запись блока в файл");
   #print FF1 @b; #|| $log->logdie("не могу записать в файл : $!");
   #@b=();
   $i++;
}
$log->debug("встретили ===, выходим");
print FF1 @b; #|| $log->logdie("не могу записать в файл : $!");
#print join("\n",@b);
close(FF1) || $log->logwarn("не могу закрыть файл открытый для записи $_");
@a = undef;
@b = undef;

sub analiz_doc() {
   my $index = shift;
   my @labels;
   my $jndex = @b;
   my @klass;
   my $flag = 1;
   my %kl = ( 20100 => "0", 20200 => "0", 20300 => "0" );   
   while ($a[$index] ne '@@@') {
      if ($a[$index] eq '###') {  $labels[@labels] = $index; }
      elsif ($labels[0] and not($labels[1]))  {
         if ($a[$index] =~ /20100:|20200:|20300:/) {
            if ($flag) { %kl = ( 20100 => "0", 20200 => "0", 20300 => "0" ); $flag = 0 ; };
            $kl{ (split(/:/,$a[$index]))[0] } = scalar((split(/:/,$a[$index]))[1]);
            }  else {      
            $b[$jndex] = join(":",$kl{20100},$kl{20200},$kl{20300},$a[$index]);
            $b[$jndex] =~ s/:/':'/g;
            $b[$jndex] = "'" . $b[$jndex] . "'\n";
            $jndex++; $flag=1; 
         }
      }    
      $index++;
   }
   return $index;
};

т.е из вида

Код: Выделить всё

ИдДок:2300*****************200900000001
ДатаДок:12.03.2009
10200:0
10300:0
###
20100:03216000000
20300:18210803010010000110
30200:15606.00
30210:15606.00
###
@@@

он сделает

Код: Выделить всё

'03216000000';'0';'18210803010010000110';'30200';'15606.00'
'03216000000';'0';'18210803010010000110';'30210';'15606.00'

т.к. мы не грузим номера и дату документов, имя файла, то коррекция данных пока только через полное удаление данных и загрузки по-новой.
Можно сделать загрузку в таблицу данных прямо скриптом, но т.к. я не знаю имеет ли Yaffil 884 функции множественной вставки, то пока отложил.

3. Слепляем получившиеся файлы TotalCommander'ом. Копируем файл поверх и при выборе опций выбираем "дописать".

4. Редактором TotalCommander меняем все ":" на ";" (в будущем может скриптом сразу сделаю).

5. Загрузку в базу можно осуществить любым ПО поддерживающим загрузку файлов в формате CSV. Я использую SQLManager 2008 for Interbase/Firebird. Грузится очень долго. Недавно наткнулся на DevTrace BlazeTop (типа IBexpert). У него есть TXTLoader, но нет к нему справки. Не смог понять как он работает.

6. Подвешиваем отчеты АС Бюджет для отображения данных из нашей таблицы. Примеры выложу чуть позже.

В Yaffil не нашел способа делать кросс-выборки. Сильно бы упростило жизнь.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 02.04.2009 14:33

Отчет формирующий все коды реквизитов с разбивкой по КД и ОКАТО (можно скрывать через динамику). Отчет дает расхождение с данными TaxForms, надеюсь ошибка не с моей стороны :-) разбираемся.
Похож на кросс-отчет в котором кросс-поле - код реквизита (03100, 03110 и т.д.). Но выборки каждого столбца осуществляются последовательно. В результате можно заголовки столбцов скрывать/открывать и менять им название на удобочитаемое. Пока не реагирует на панель параметров.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 02.04.2009 14:47

Отчет выбирающий по КД: план доходов, факт доходов, поступление по данным налоговой (30200-30300). Реальной ценности не имеет. Пробовал на нем соединение данных обычных полей и своих полей по КД. Реагирует на панель параметров только в части плана и факта доходов.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 02.04.2009 15:22

Кросс отчет средствами отчетницы. Крайний правый столбец не могу убрать (туда идет сумма по горизонтали, но в данном случае это неверно). Не реагирует на панель параметров.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 03.04.2009 08:45

Отчет 00.50.10.95 на базе 00.50.10.97. Более читабельный вид. Строки младших кодов скрыты, но можно открыть. Добавлены колонки 302х0-303х0.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 03.04.2009 09:18

Что хотелось бы изменить:
1. Сделать кросс-выборку, чтоб результат одной выборки был в виде
КД|ОКАТО|сумма30100|сумма30110|сумма30120|......|сумма50140.
Далее уже всю обработку делать средствами отчетницы
или
Осуществлять полную выборку, а далее, методами фильтрации статических данных и PumpData перекачивать в результирующий набор как надо. Т.е. фильтруем-перекачиваем, фильтруем по другому - перекачиваем и т.д.
сделано в 00501094
сделано в 00501093
В данный момент каждая колонка результирующего статиксета формируется отдельным запросом.
2. Подбитие итогов (например по КД) на отчетнице работает, но не дает сумму по вычисляемым полям. Не пойму в чем дело. Можно конечно сделать поля типа Скрипт и туда забирать данный из вычисляемых, но это долго и нудно.
сделано в 00501093
3. Параметры фильтрации с панели параметров не берутся. Можно сделать КД, Бюджет (ОКАТО) и сумму.
сделал в 00501095 фильтрацию по КД и Бюджет(ОКАТО)
сделано в 00501094
сделано в 00501093
4. В данный момент в результирующий статиксет выбираются все поля вне зависимости какие поля открыты в шаблоне, в результате независимо от кол-во столбцов время выполнения отчета около 2 минут. Можно сделать ограничение.
сделано в 00501094
сделано в 00501093
5. Попробовать разыменовку КД и ОКАТО. А если сильно рамахнуться, то можно сделать разыменовку "кода реквизита" (03100, 03110 и т.д) путем создания таблицы справочника этих кодов.
6. Добавить ОКВЭД и СтатусПлательщика и КодПлательщика (10100,10200,10300) в базу и в отчет.
сделано в 00501093

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 03.04.2009 11:50

Подправил 00501095. На панель параметров нужно вынести КД и МультиБюджет. Отчет их учитывает. Скрыты некоторые стоблцы
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 06.04.2009 13:49

00501094
оптимизированы запросы.
время выполнения около 30 сек.
начальный набор кодов теперь в статике для скорости.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 07.04.2009 10:51

Выяснилось, что ОКВЭД тоже нужен.
Базу с новым именем VAL_TAX_DATA

Код: Выделить всё

SET NAMES WIN1251;
CREATE GENERATOR GEN_VAL_TAX_DATA_ID;
CREATE TABLE VAL_TAX_DATA (
    ID       ID /* ID = INTEGER NOT NULL */,
    OKVED    NOTE50 COLLATE PXW_CYRL /* NOTE50 = VARCHAR(50) */,
    STPL     CLS DEFAULT 0 /* CLS = INTEGER NOT NULL */,
    KPL      CLS DEFAULT 0 /* CLS = INTEGER NOT NULL */,
    OKATO    VARCHAR(11) DEFAULT 0 NOT NULL COLLATE PXW_CYRL,
    STATUS   CLS DEFAULT 0 /* CLS = INTEGER NOT NULL */,
    KDVALUE  NOTE20 /* NOTE20 = VARCHAR(20) */,
    KOD      INTEGER DEFAULT 0 NOT NULL,
    SUMMA    MONEY32 DEFAULT 0 NOT NULL /* MONEY32 = NUMERIC(15,2) default 0 */
);
SET TERM ^ ;
/* Trigger: VAL_TAX_DATA_BI */
CREATE TRIGGER VAL_TAX_DATA_BI FOR VAL_TAX_DATA
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_VAL_TAX_DATA_id,1);
end
^
SET TERM ; ^
/* Privileges of users */
GRANT ALL ON VAL_TAX_DATA TO PUBLIC;


perl скрипт обновлен.

Код: Выделить всё

# Конвертер Tax в реляционный формат для загрузки в базу
# версия 1.0
# добавлена обработка полей ОКАТО, СтатусПлательщика, КодПлательщика
# версия 1.1
# требует наличия:
# Val 06042009
use strict;
use Log::Log4perl;
   Log::Log4perl::init("log.conf");
   my $log = Log::Log4perl::get_logger("main");
use Cwd;
my ($fname_dir,$fname_in,$fname_out);
$fname_dir =  getcwd; # имя текущего каталога
$fname_in = shift @ARGV; # первый аргумент - имя файла для обработки
$fname_out = shift @ARGV; # второй аргумент - имя файла для записи
$log->debug("файл для чтения : $fname_in");
$log->debug("файл для записи : $fname_out");

my @b;
open(FF,$fname_in) || $log->logdie("не могу открыть фалй для чтения : $!");
open(FF1,'>'.$fname_out) || $log->logdie("не могу открыть файл для записи : $!");
my @a = <FF>;
chomp(@a);
close(FF) || $log->logwarn("не могу закрыть файл открытый для чтения $_");;
my $i=10;
my $j=0;
while ($a[$i] ne '===') {
   print "начинаем обработку документа на строке $i\n"; 
   $log->debug("запускаем анализ документа со строки $i"); 
   $i = &analiz_doc($i);
   $log->debug("окончили анализ докумета на строке $i");
   $log->debug("запись блока в файл");
   #print FF1 @b; #|| $log->logdie("не могу записать в файл : $!");
   #@b=();
   $i++;
}
$log->debug("встретили ===, выходим");
print FF1 @b; #|| $log->logdie("не могу записать в файл : $!");
#print join("\n",@b);
close(FF1) || $log->logwarn("не могу закрыть файл открытый для записи $_");
@a = undef;
@b = undef;

sub analiz_doc() {
   my $index = shift;
   my @labels;
   my $jndex = @b;
   my @klass;
   my $flag_k = 1;
   my $flag = 1;
   my %k = ( 10100 => "0", 10200 => "0", 10300 => "0" );
   my %kl = ( 20100 => "0", 20200 => "0", 20300 => "0" );   
   while ($a[$index] ne '@@@') {
      if ($a[$index] eq '###') {  $labels[@labels] = $index; }
      elsif (not($labels[0]) and not($labels[1])) {
         if ($a[$index] =~ /10100:|10200:|10300:/) {
            if ($flag_k) { %k = ( 10100 => "0", 10200 => "0", 10300 => "0" ); $flag_k = 0 ; };      
            $k{ (split(/:/,$a[$index]))[0] } = scalar((split(/:/,$a[$index]))[1]);
         }   
      }      
      elsif ($labels[0] and not($labels[1]))  {
         if ($a[$index] =~ /20100:|20200:|20300:/) {
            if ($flag) { %kl = ( 20100 => "0", 20200 => "0", 20300 => "0" ); $flag = 0 ; };
            $kl{ (split(/:/,$a[$index]))[0] } = scalar((split(/:/,$a[$index]))[1]);
            }  else {      
            $b[$jndex] = join(":",$k{10100},$k{10200},$k{10300},$kl{20100},$kl{20200},$kl{20300},$a[$index]);
            $b[$jndex] =~ s/:/':'/g;
            $b[$jndex] = "'" . $b[$jndex] . "'\n";
            $jndex++; $flag=1; $flag_k=1; 
         }
      }    
      $index++;
   }
   return $index;
};

Сделал отчет 00501093. В нем реализовано почти все что планировал:
(реакция на Мультибюджет и КД на параметрах
поля ОКАТО, СтатусПлат, КодПлат
корректные промежуточные итоги
оптимизация запроса)

Поля СтатусПлательщика и КодПлательщика разыменованы. Поле КД можно разыменовывать через динамику.
Через динамику в данный отчет можно вытянуть все что надо. Если делаете промежуточные итоги - не забывайте эти поля перемещать вверх.
Если кто будет себе ставить, обратите внимание на процедуру обработки параметра МультиБюджет. У меня там обрабатывается мой район вручную.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 08.04.2009 14:06

00501092 - тоже самое что и 00501093, только включена дополнительная фильтрация.КД становится DDDDDDDD000000000000.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 14.04.2009 15:57

изменил скрипт

Код: Выделить всё

# Конвертер Tax в реляционный формат для загрузки в базу
# версия 1.0
# добавлена обработка полей ОКАТО, СтатусПлательщика, КодПлательщика
# версия 1.1
# сам грузит в базу. параметром передается имя каталога
# добавлена загрузка в базу поля FILENAME
# версия 1.2

# требует наличия:
# Val 06042009
system 'chcp 1251';
use strict;
use Log::Log4perl;
   Log::Log4perl::init("log_code_nalog3.conf");
   my $log = Log::Log4perl::get_logger("main");
use Cwd;
use DBI;
use File::Basename;

my $DB_HOST = 'bigfinupmain';
my $DB_NAME_DB = 'D:\BudgetAx2009\Database\BUDGET2009.GDB';
my $DB_NAME_REG = 'D:\BudgetAx2009\Database\DBREG2009.GDB';
my $DB_CHARSET = 'WIN1251';
my $DB_USER = 'sysdba';
my $DB_PASSWORD = 'nastik';
my $dsn_db = "DBI:InterBase:database=$DB_NAME_DB;host=$DB_HOST;charset=$DB_CHARSET;ib_charset=win_1251";
my $dsn_reg = "DBI:InterBase:database=$DB_NAME_REG;host=$DB_HOST;charset=$DB_CHARSET;ib_charset=win_1251";
my $dbh;
my $sth;

my $count;
my @b;
my @a;


openDB($DB_HOST,$DB_NAME_DB,$DB_USER,$DB_PASSWORD,$DB_CHARSET);
my ($fname_dir,$fname_in,$fname_out);
my ($fname_dir2,$fname_in2,$fname_suf2);

my $dir = shift @ARGV;
my @files = glob("$dir/*.txt");
# все файлы в каталоге
#-------------------------------------------------------------------------------
foreach (@files) {
   $fname_in = $_;
   $fname_out = $_ . ".tmp";
   $fname_dir = $dir;
#$fname_dir =  getcwd; # имя текущего каталога
#$fname_in = shift @ARGV; # первый аргумент - имя файла для обработки
#$fname_out = shift @ARGV; # второй аргумент - имя файла для записи
$log->info("файл для чтения : $fname_in");
$log->info("файл для записи : $fname_out");

($fname_in2,$fname_dir2,$fname_suf2) = fileparse($fname_in);

open(FF,$fname_in) || $log->logdie("не могу открыть фалй для чтения : $!");
open(FF1,'>'.$fname_out) || $log->logdie("не могу открыть файл для записи : $!");
@b = "";
@a = <FF>;
chomp(@a);
$count = scalar(@a);

close(FF) || $log->logwarn("не могу закрыть файл открытый для чтения $_");;
my $i=10;
my $j=0;
while ($a[$i] ne '===') {
   print "начинаем обработку документа на строке $i\n"; 
   $log->info("запускаем анализ документа со строки $i из общего числа строк $count файла $fname_in2"); 
   $i = &analiz_doc($i);
   $log->info("окончили анализ докумета на строке $i из общего числа строк $count файла $fname_in2");
   $log->debug("запись блока в файл");
   #print FF1 @b; #|| $log->logdie("не могу записать в файл : $!");
   #@b=();
   $i++;
}
$log->info("встретили ===, выходим");
print FF1 @b; #|| $log->logdie("не могу записать в файл : $!");
#print join("\n",@b);
close(FF1) || $log->logwarn("не могу закрыть файл открытый для записи $_");
}
#-------------------------------------------------------------------------------

@a = undef;
@b = undef;
closeDB();
sub analiz_doc() {
   my $index = shift;
   my @labels;
   my $jndex = @b;
   my @klass;
   my $flag_k = 1;
   my $flag = 1;
   my %k = ( 10100 => "0", 10200 => "0", 10300 => "0" );
   my %kl = ( 20100 => "0", 20200 => "0", 20300 => "0" );   
   while ($a[$index] ne '@@@') {
      if ($a[$index] eq '###') {  $labels[@labels] = $index; }
      elsif (not($labels[0]) and not($labels[1])) {
         if ($a[$index] =~ /10100:|10200:|10300:/) {
            if ($flag_k) { %k = ( 10100 => "0", 10200 => "0", 10300 => "0" ); $flag_k = 0 ; };      
            $k{ (split(/:/,$a[$index]))[0] } = scalar((split(/:/,$a[$index]))[1]);
         }   
      }      
      elsif ($labels[0] and not($labels[1]))  {
         if ($a[$index] =~ /20100:|20200:|20300:/) {
            if ($flag) { %kl = ( 20100 => "0", 20200 => "0", 20300 => "0" ); $flag = 0 ; };
            $kl{ (split(/:/,$a[$index]))[0] } = scalar((split(/:/,$a[$index]))[1]);
            }  else {      
            $b[$jndex] = join(":",$k{10100},$k{10200},$k{10300},$kl{20100},$kl{20200},$kl{20300},$a[$index]);
            $b[$jndex] =~ s/:/':'/g;
            $b[$jndex] = "'" . $b[$jndex] . "'\n";
            writedb($b[$jndex],$fname_in2);
            $jndex++; $flag=1; $flag_k=1; 
         }
      }
      $log->debug("record " . $index . " из " . $count);    
      $index++;
      
   }
   return $index;
};

sub writedb {
   my $str = shift;
   my $fname = shift;
   my $s;
   my @s2 = split(/:/,$str);
   
   $s="insert into val_tax_data(OKVED,STPL,KPL,OKATO,STATUS,KDVALUE,KOD,SUMMA,FILENAME) values (";
   foreach (@s2) { $s .= $_ . "," };
   $s .= "'" . $fname . "')";
   $log->debug("Сформировали запрос : " . $s);
   $dbh -> do($s);
   if ($dbh->err) { $log->logdie("SQL Error : ".$dbh->errstr) } else { $log->debug("Запрос выполнен без ошибок") };
}

sub openDB {
   my ($HOST_l,$DB_l,$USER_l,$PASSWORD_l,$CHARSET_l) = @_;
   my $DSN_l = "DBI:InterBase:database=$DB_l;host=$HOST_l;charset=$CHARSET_l;ib_charset=win_1251";
   $dbh = DBI->connect($DSN_l, $USER_l, $PASSWORD_l) or die "Can't connect to $DSN_l: $DBI::errstr";
}
#-------------------------------------------------------------------------------
sub closeDB {
   $dbh->disconnect();
}


добавил поле в базу

Код: Выделить всё

SET NAMES WIN1251;
CREATE GENERATOR GEN_VAL_TAX_DATA_ID;
CREATE TABLE VAL_TAX_DATA (
    ID        ID /* ID = INTEGER NOT NULL */,
    OKVED     NOTE50 COLLATE PXW_CYRL /* NOTE50 = VARCHAR(50) */,
    STPL      CLS DEFAULT 0 /* CLS = INTEGER NOT NULL */,
    KPL       CLS DEFAULT 0 /* CLS = INTEGER NOT NULL */,
    OKATO     VARCHAR(11) DEFAULT 0 NOT NULL COLLATE PXW_CYRL,
    STATUS    CLS DEFAULT 0 /* CLS = INTEGER NOT NULL */,
    KDVALUE   NOTE20 /* NOTE20 = VARCHAR(20) */,
    KOD       INTEGER DEFAULT 0 NOT NULL,
    SUMMA     MONEY32 DEFAULT 0 NOT NULL /* MONEY32 = NUMERIC(15,2) default 0 */,
    FILENAME  NOTE255 COLLATE PXW_CYRL /* NOTE255 = VARCHAR(255) */
);
SET TERM ^ ;
/* Trigger: VAL_TAX_DATA_BI */
CREATE TRIGGER VAL_TAX_DATA_BI FOR VAL_TAX_DATA
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_VAL_TAX_DATA_id,1);
end
^
SET TERM ; ^
/* Privileges of users */
GRANT ALL ON VAL_TAX_DATA TO PUBLIC;

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 15.04.2009 09:40

Проблема расхождения данных с кодом 40200 моего отчета и программы TaxForms остается. Вчера не поленился и решил проверить серъезно.
У меня сумму за март по коду 40200 без ограничений 110954616,05, а в TaxForms 111330161,22.
Решил выделить все суммы по 40200 без обработки из файла. Такой маленький скрипт выделяет эти строки из всех файлов в переданном ему в качестве аргумента каталоге и записывает их в тот же каталог в файл a.txt.

Код: Выделить всё

use strict;
my $dir = shift @ARGV;
my @files = glob("$dir/*.txt");
my $file_out = $dir . "/a.txt";
open(FF1,">".$file_out);
foreach (@files) {
   open(FF,$_);
   my @a = <FF>;
   #chomp(@a);
   foreach(@a) {
   if ($_ =~ /40200:/) { print FF1 $_  };
    }
    close(FF);
}
close(FF1);

Затем этот файл загружаем в Excel с разбивкой по столбцам по символу ":" и подбиваем итого по столбцу сумм. Результат такой как у меня в отчете (110954616,05).
далее:
запускаем например EMS SQL Manager for MSSQL, открываем базу TAX2009 и выполняем к ней запрос вида:

Код: Выделить всё

select idnalog, summa
from payments p where p.idtypepay=40200 order by summa

он должен выбрать нам все строки загруженные из файлов у которых код >=30100, т.е. с строки с данными.
Результат экспортируем в Excel и копируем/вставляем с раннее полученным резальтатом моего скрипта.
Сортируем по суммам и ставим их рядом. Расхождения сразу бросаются в глаза:

Код: Выделить всё

40200   42,64   42,64    557 390
40200   42,64   42,64    458 907
40200   42,64   42,64    458 907
40200   42,64   42,64    508 143
40200   42,64   42,64    557 199
      42,64    531 701

Здесь мы выдим что одна сумма на 42,64 лишняя в столбце данных TaxForms, логично предположить что лишняя одна из двух сумм с одинаковыми кодами дохода (458907).
Здесь я предпологаю, что данные в таблице payments базы tax2009 полностью соответствую записям в текстовых файлов налоговой
Делаем выборку чтоб увидеть КД для этих (возможно задвоенных) сумм.

Код: Выделить всё

select n.kbk, p.idnalog, p.summa
from payments p,nalogs n,documents d where p.idtypepay=40200 and summa=42.64 and p.idnalog=458907 and p.idnalog=n.idnalog and n.iddocument=d.iddocument order by summa

В моем случае 18210606013100000110.

В TotalCommander открываем его редактором AkelPad первый файл налоговой и ищем строку "40200:42,64". При нахождении анализируем соответвующий ей код 20300 c КД.
Нашел 5 совпадений, одно подходит по КД.

Код: Выделить всё

ИдДок:2300*****************200900002323
ДатаДок:09.04.2009
10100:52.33
10200:09
10300:0
###
20100:03216819000
20300:18210606013100000110
30100:-467.97
30110:-469.50
30120:1.53
30200:31.30
30210:31.30
40100:5.03
40120:5.03
40300:5.03
50000:406.20
50100:406.20
20100:03216819000
20300:18210502000020000110
50000:274.00
50100:274.00
20100:03216819000
20300:18210606013100000110
40100:42.64
40110:42.64
40200:42.64
###
@@@

Откуда взялась вторая сумма 42,64 по коду 18210606013100000110 - не понимаю.
P.S.
Кода делал скрипт перекачки данных в АС Бюджет столкнулся ситуацией вроде такой:

Код: Выделить всё

20100:03411000000
20300:18210606013100000110
20100:03411000000
20300:18210904050100000110
40100:0.73
40120:0.73
40300:0.73

т.е. два заголовка 20ХХХ подряд. Пришлось подкорректировать алгоритм обработки.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: TaxForms в АС Бюджет

Сообщение Val » 30.04.2009 10:38

выделил в файл один документ

Код: Выделить всё

ИдФайл:2300*****************20090409234409
ТипИнф:ИНФОРМ_МАССИВ
ИдПол:Ейский район
НаимОтпр:2300
ТелОтпр:1184
ФИООтпр:Николайко,Виктория,Михайловна
ВерсФорм:3.02
ВерсПрог:Регион_1.4.24#03.2009
КолДок:1322 
@@@
ИдДок:2300*****************200900002323
ДатаДок:09.04.2009
10100:52.33
10200:09
10300:0
###
20100:03216819000
20300:18210606013100000110
30100:-467.97
30110:-469.50
30120:1.53
30200:31.30
30210:31.30
40100:5.03
40120:5.03
40300:5.03
50000:406.20
50100:406.20
20100:03216819000
20300:18210502000020000110
50000:274.00
50100:274.00
20100:03216819000
20300:18210606013100000110
40100:42.64
40110:42.64
40200:42.64
###
@@@
===

и загрузил в чистую базу TaxForms.
формирую отчет
и получаю по коду 40200 сумму в 2 раза больше чем в файле.
Посмотрите свежим взглядом, может я чего нибудь недопонял?
У вас нет необходимых прав для просмотра вложений в этом сообщении.


Вернуться в «АС Бюджет»

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 5 гостей

cron