...Да  big_smile

Xexrby Tdutybq wrote:

а есть вариант создания временых таблиц?

CREATE TEMPORARY TABLE VremTablitsa
(
id INTEGER PRIMARY KEY , 
Region TEXT ,
Raion TEXT ,
NasPunkt TEXT ,
Magazin TEXT ,
Tsena INTEGER
);

С таблицей можно работать как с обычной только после всех манипуляций надо сделать

DROP TABLE VremTablitsa;

Только учтите что через кнопку можно скормить только один запрос . То есть скормить пачку для расчетов не получится придется скриптом
...можно конечно попробовать сделать вывих мозга и написать один запрос но что-то мне кажется это не получится big_smile .
Так же имеет смысл посмотреть в сторону GROUP BY и его производных.
...если за выходные не напишете то я к вам присоединюсь на следующей неделе ( по наличию свободного времени )

1C сама на SQL работает ( в зависимости от версий )
по идее можно напрямую подключиться к базе . ( если они палок не понавставляли в виде шифрования и прочих прелестей)

79

(30 replies, posted in Russian)

if aaa < 0 then
    begin
           //.....
           // Тут мы не сохраняем запись а что нибудь еще например считаем
           // .....
    end
else
    begin
     SQLExecute('INSERT INTO sobitiya ( data , sobitie ) VALUES ( '+zakazi.DateTimePicker1.sqlDateTime+', '+ zakazi.Edit1.sqlValue +' )');
    end;

http://www.mysql.ru/docs/man/INSERT.html

Символ переноса строки это символ с номером 13 его можно вставить с помощью
функции преобразования номера символа в символ chr(13). ( если его надо вставить в скрипте )
...если я правильно понял что вам надо.

http://book.itep.ru/10/ascii.htm

http://www.mysql.ru/docs/man/String_syntax.html

не     /n     а      \n

81

(30 replies, posted in Russian)

Правильно будет в запрос передавать sqlValue
Form1.edNom.Text := SQLExecute('SELECT nom FROM primer WHERE number = '+Form1.edNumber.sqlValue );
Но если вам скучно то можно написать и так :
Form1.edNom.Text := SQLExecute('SELECT nom FROM primer WHERE number = '+chr(39)+Form1.edNumber.text+chr(39) );

chr(39) это вставка символа с 39 номером ' ( апостроф )
Таблицу мона глянуть тут например http://book.itep.ru/10/ascii.htm

Так же можете посмотреть пример

SELECT DISTINCT
`vr_zakazi`.`НомерЗаказа`,
`vr_zakazi`.`ДатаЗаказа`,
`vr_klienti`.`Наименование`,
`vr_mediaplan`.`НомерПоздравления`,
`vr_mediaplan`.`ДатаЭфира`,
`vr_mediaplan`.`ВыборБлока0900`,
`vr_mediaplan`.`ВыборБлока1300`,
`vr_mediaplan`.`ВыборБлока2000`,
`vr_adresati`.`Наименование`,
`vr_mediaplan`.`СтатусАктивен`,
`vr_mediaplan`.`СтатусВыполнен`,
`vr_mediaplan`.`ПожеланиеНомер0900`,
`vr_mediaplan`.`ПожеланиеНомер1300`,
`vr_mediaplan`.`ПожеланиеНомер2000`,
`vr_mediaplan`.`Музыка0900`,
`vr_mediaplan`.`Музыка1300`,
`vr_mediaplan`.`Музыка2000`,
`vr_mediaplan`.id
FROM `vr_mediaplan`
LEFT OUTER JOIN `vr_adresati` ON `vr_mediaplan`.`id_vr_adresati`=`vr_adresati`.id
LEFT OUTER JOIN `vr_klienti` ON `vr_mediaplan`.`id_vr_klienti`=`vr_klienti`.id
LEFT OUTER JOIN `vr_zakazi` ON `vr_mediaplan`.`id_vr_zakazi`=`vr_zakazi`.id
WHERE `vr_zakazi`.`ДатаЗаказа` >= '2016-03-18 00:00:00.000'
  AND `vr_zakazi`.`ДатаЗаказа` <= '2016-03-18 23:59:59.999"     <---- Не из за кавычки вместо апострофа ?
  AND `vr_mediaplan`.`ДатаЭфира` >= '2015-12-19 00:00:00.000'
      ORDER BY `vr_mediaplan`.`ДатаЭфира` ASC
 
 
http://www.mysql.ru/docs/man/String_syntax.html

На широком экране сайт не использует около 40%  площади экрана .

именно такое добавление записи и запрещено дабы не возникло коллизий
SQLExecute('insert into kash (id_azs,date,gotov,Z_A80) SELECT id_azs,date,gotov,Z_A80  FROM kash WHERE date ='+D1+' and id='+azstext+'')

procedure rep_button1_OnClick (Sender: string; var Cancel: boolean);
var
D1, D2: string; //даты 1 и 2    ***где какая ... DataNaUdalenie , DataDlyaZameni ...
azs: integer;//количество записей в справочнике АЗС
idkash,azsx: integer;//переменная - УН записи АЗС
idkash1, azstext: string;
begin
D1 := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000',  (rep.DateTimePicker1.DateTime)) + '"';
D2 := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000',  (rep.DateTimePicker2.DateTime)) + '"';

SQLExecute('delete from kash where date = '+D2+'') ; // ***Удалить из таблицы КЭШ записи с датами D2 ?  зачем ?

azs:= SQLExecute('SELECT max(id) FROM azs ;') ;//определяем максимальную УН запись в справочнике АЗС для составления цикла

idkash:= SQLExecute('SELECT max(id) FROM kash ;') ;//определяем максимальную УН запись в данных

for azsx:=1 to azs do // цикл создания записей начиная с 1-й записи в справочнике АЗС и заканчивая последней
    begin
        azstext:=VarToStr (azsx);
        if SQLExecute('SELECT count(id) FROM azs WHERE id='+azstext+'') = 1 then  // ***Если количество найденных записей с индексом azsx будет   = 1 ???***
                                                                                  // ***со временем цикл будет расти пропуская удаленные ID
           begin
            SQLExecute('insert into kash (id_azs,date,gotov,Z_A80) SELECT id_azs,date,gotov,Z_A80  FROM kash WHERE date ='+D1+' and id='+azstext+'');  //  ***  Тут полный ахтунг  выборка из КЭШ по ID из AZS ??? возможно id_azs ?

            UpdateDatabase('kash');
           end
        else  ShowMessage ('В справочнике АЗС нет такого УН');
    end;
idkash1:=VarToStr (idkash);
SQLExecute('update kash SET date = '+D2+' where id>'+idkash1+'');
UpdateDatabase('kash');
end;

id_azs это наименование запрвки ?

'update kash SET date = '+D2+'where id IN (select id from kash where id>'+idkash+' )'

Суть задачи понятна хотя вы нераскрыли полностью сути проблемы.
...но остались вопросы
1. Какова временнАя актуальность таблицы кэш ? ( день , месяц , год  ? и нужно ли ее хранить или она меняется каждый день ? )
2. Каким способом происходит сбор данных такого объема ?
3. Зачем вам хранить числа как числа ? Они будут еще где-то использоваться ?
4. Почему бы не сделать редактирование прямо в таблгриде ? ( можно поизвращаться немного но это думаю реализуемо )

DriveSoft wrote:

Приветствую,


К сожалению я не могу помочь с алгоритмом, я могу помочь только с конкретным вопросом.

Дмитрий здравствуйте !
Посчитав задачу интересной я хотел человеку помочь и напоролся на баг (ИМХО)
задача состояла в том что бы из таблицы выбрать записи с определенной датой ( я сделал по диапазону дат ) и скопировать эти записи в ту же таблицу но заменив дату на указанную в датетаймпикчере

первая реализация состояла в том чтоб сперва SQL запросом заполнить таблгрид и от туда в цикле от количества записей их скопировать обратно в таблицу с заменой даты. ( работает полностью так как задумано )

Вторая реализация состояла из того что вместо таблгрида я использовал класс TDataSet и тут я вчера вынес себе мозг.....
Проблема состояла в том что вместо того чтоб произвести ОДНУ новую запись SQL запрос уходил в вечную циклическую запись одинаковых строк .
Путем нескольких экспериментов я установил что если вместо даты в запрос скармливать любой текст то все работает так как нужно единственно что вместо даты будет текст , НО если в запрос вставить дату в ТЕКСТОВОМ виде запрос уходит в нирвану .....

Первая реализация:

procedure zakazi_Primenit_OnClick (Sender: string; var Cancel: boolean);
var
i : integer ;
begin
 for i := 0 to zakazi.Tabl.RowCount -1 do
  begin
   SQLExecute('INSERT INTO sobitiya ( data , sobitie ) VALUES ('+zakazi.Ust.sqlDateTime+', '+chr(39)+ zakazi.Tabl.Cells[2,i]+chr(39)+' )');
  end;
  zakazi.Pokazati.Click ;
end;

Вторая реализация : ( Которая уходит в нирвану)

procedure zakazi_Button1_OnClick (Sender: string; var Cancel: boolean);  // Через TDataSet
var
    PromTabl : TDataSet;  // Объявляем класс TDataSet
begin
    // Заполняем класс данными по условию между двух дат (Заполняет корректно)
    SQLQuery('SELECT id ,data ,sobitie FROM sobitiya WHERE data Between '+ zakazi.dtFrom.sqlDateTime+' AND '+ zakazi.dtTo.sqlDateTime ,PromTabl);


    while not PromTabl.Eof do    // Если указатель записи не на конце выполнить

    begin  // Собственно запрос который уходит в бесконечный цикл записи при наличии даты  в тексте  
       SQLExecute('INSERT INTO sobitiya ( data , sobitie ) VALUES ( '+zakazi.Ust.sqlDateTime+', '+chr(39)+PromTabl.FieldByName('sobitie').AsString+chr(39) +' )');

       PromTabl.Next; //  Указатель перемещаем на следующую запись
    end;

    PromTabl.Free;
    zakazi.Pokazati.Click ;
end;

творение прикладываю , нужное закоментил.( сделал в версии 2.4 )
...если кому надо внутри есть и выборка по диапазону дат  и времени и функция преобразования DateTime в строку для SQL с миллисекундами ( передавать надо через текстовое поле )

..да только или через временную таблицу через CREATE TEMPORARY TABLE
или как я топорным вариантом ))
поставьте программу посвежее
мой первый вариант откройте .
если хотите для простоты все лишнее уберу совсем

В общем то что я второй раз написал делать НЕЛЬЗЯ оказывается .

Цитирую букварь.

Целевая таблица команды INSERT не должна появляться в утверждении FROM части SELECT данного запроса, поскольку в ANSI SQL запрещено производить выборку из той же таблицы, в которую производится вставка. (Проблема заключается в том, что операция SELECT, возможно, найдет записи, которые были внесены ранее в течение того же самого прогона команды. При использовании команд, внутри которых содержатся многоступенчатые выборки, можно легко попасть в очень запутанную ситуацию!)

INSERT INTO sobitiya ( data , sobitie )
VALUES
(
{Ust},
( SELECT sobitie FROM sobitiya WHERE data BETWEEN {dtfrom} AND {dtto} )

)

Переводится так :
ВСТАВИТЬ В ТАБЛИЦУ sobitiya ( data , sobitie )
ЗНАЧЕНИЯ
(
{Ust},
( ВЫБРАТЬ sobitie ИЗ ТАБЛИЦЫ sobitiya С УСЛОВИЕМ ЧТО data НАХОДИТСЯ МЕЖДУ {dtfrom} И {dtto} )

)

Стоит пояснить что я использовал вложенный SQL запрос , и по количеству выданных данных будет произведено соответствующее количество новых записей оператором INSERT


)) и что то он не работает так как надо в отличие от первого варианта

...хмм , у меня  версия 2.4 . Сам скачал и проверил все открывает

отличие вашей задачи лишь в количестве столбцов
У Вас есть установочный  версии 1.46 ?

Xexrby Tdutybq wrote:

Есть таблица (скажем kash).
Есть 20 полей. одно из них Дата.
Нужно выбрать все засписи с опредленной датой и продублировать все данные но уже с другой датой.
Подскажите. где то уже видел это на форуме. найти не могу

...это топорный вариант но если смотреть ничего не надо то можно и одним SQL запросом обойтись )))

вот для примера слепил а вообще мы не телепаты Ваш код дистанционно просматривать.
https://yadi.sk/d/IhOkn7XIq6VKX
....  к слову сказать запись даты и времени ( в случае с миллисекундами  ) тоже требует танца с бубном
для которого я писал отдельно функцию.
(допускаю что чего-то не понимаю или не знаю)

Запрос по кнопке будет так :

SELECT DISTINCT 
users.Besday,
users.id
FROM users 
WHERE 
users.Besday > '2016-03-01 00:00:00.000' AND users.Besday < '2016-03-01 23:59:59.999' 
ORDER BY users.Besday ASC 

можно так : ( если дата статична )

SELECT DISTINCT 
users.Besday,
users.id
FROM users 
WHERE 
users.Besday > '2016-03-01 00:00:00.000' AND users.Besday < '2016-03-02 00:00:00.000' 
ORDER BY users.Besday ASC 

можно так:

SELECT DISTINCT 
users.Besday,
users.id
FROM users 
WHERE 
users.Besday Between '2016-03-01 00:00:00.000' AND  '2016-03-02 00:00:00.000' 
ORDER BY users.Besday ASC
captgreen wrote:

Для полей таблицы добавить свойство "Название по умолчанию" которое будет подставляться в компоненты формы.

Абсолютно не согласен !!!  Все имена должны быть прописаны ручками и более того носить ОСМЫСЛЕННЫЕ имена . Когда программа ( проэкт ) разрастается до больших размеров начинается пропарка мозгов : - .... и шо я там писалл ...
и этот момент обычно наступает когда менять имена таблиц , окон , функций и т.д уже ПОЗДНО.!!!

НЕ ЛЕНИТЕСЬ писать осмысленные имена , сами себе потом спасибо скажите.

96

(8 replies, posted in Russian)

Дмитрий как мне вставить в запрос , которым заполняется combobox , опцию   DISTINCT ? ,   для заполнения  уникальными полями.
И второй вопрос как отключить возможность пустого выбора ? ( пустая строка при открытии  combobox c возвратом  -1 )

97

(8 replies, posted in Russian)

Дабы не быть голословным http://rghost.ru/8ZYb8sydq  ( Ошибка с DateTimePicker )

спасибо за пример выше !!

98

(8 replies, posted in Russian)

DriveSoft wrote:

(Подробней о свойстве "Calendar")

Для sql запроса их надо сводить в скрипте
http://rghost.ru/6g7Szx2zV
но и после того как в datatimepicker точно находится то что надо выборка через SQL запрос происходит только по дате но не по времени .
... но прогнав .sqldatetime через поле Edit.text происходит чудо и все сразу ищется и выводится .
...мистика
так же мне непонятно поведение SQLExecute
.Text := SQLExecute( 'SELECT data FROM sd WHERE id=10' );    Работает
.Text := SQLExecute( 'SELECT data FROM sd WHERE id>10' );    Не работает
.Text := SQLExecute( 'SELECT data FROM sd WHERE ORDER BY id' );   Не работает
по всей видимости запрос может передать только одно поле из базы данных

99

(8 replies, posted in Russian)

http://rghost.ru/7zssYBHWk

....нужна не только кнопка сворачивания процедур но и поиск с заменой , а так же при смене имени формы чтоб происходила замена всех обращений к объектам на форме на соответствующее иначе все сразу становится не работоспособным .( это не единственная зависимость )
процедуры и функции лучше оставлять в том виде как они были при сохранении.
есть необходимость двигания выделенного текста вправо влево для придания читабельности.

100

(8 replies, posted in Russian)

Здравствуйте Дмитрий !
Здравствуйте все !   )))

...когда количество строк кода в пределах сотен то не заметны не дочеты ,
но когда их количество насчитывает тысячи уже неудобно работать.

1.  Каждый раз при загрузке проекта все процедуры развернуты.( попробуйте что то найти )
2.  Некорректно работает раскрывающийся список свойств
3.  Нет подсветки синтаксиса операторов, функций и тд. и тп.
4.  Нет встроенной справки по Фастскипту
( просто дописать на русском что какая функция делает и что особенно важно свойства объектов вкратце там где F(x)  )
5.  Список свойств не работает для скриптовых объектов
6.  Не корректно работает DateTimePicker ( 3 ошибки несчитая отсутствия милисекунд )


...что вспомню допишу