Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#1321: 2014-11-11 23:19:17 ЛС | профиль | цитата
Poputchik писал(а):
Я понимаю что как то подобно этому запросу: SELECT '%1' FROM '%2' WHERE ??? = max ;
но если так то ошибка, нужно как-то правильно записать "??? = max" иначе SQLite понимает max как колонку которой нет и ??? что лучше использовать (можно что либо кроме id или нет?)
SELECT %1 FROM %2 WHERE id = (SELECT max(id) FROM %2) ;
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:Poputchik
Ответов: 413
Рейтинг: 57
#1322: 2014-11-13 23:59:21 ЛС | профиль | цитата
Опять в чем то ошибаюсь, если кто знает - подскажите.
Создаю внутри базы вторую таблицу:
CREATE TABLE if not exists sroki(
id INTEGER primary key AUTOINCREMENT, --1. id
id_res INTEGER REFERENCES reshenia(id) --2. соответствующий id в таблице reshenia
on delete set NULL --3. при удалении строки в таб. reshenia значения устанавливаются в NULL
deferrable initially deferred, --4. так надо сам не знаю зачем
srok_res INTEGER --5. дата исполнения предписания
);
Так добавляю строки в эту таблицу сразу после добавления записи в родительскую "reshenia":
INSERT OR REPLACE INTO 'sroki' VALUES (NULL, (select max(id) from reshenia), '%1');
По идеи при удалении соответствующей строки из таблицы reshenia значения в соответствующей строке таблицы sroki должны стать равными NULL. Но ничего в таблице не изменяется. В чем я ошибся?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1323: 2014-11-14 08:21:55 ЛС | профиль | цитата
1. Зачем хранить в sroki записи у которых нет id_res ? А про просто удалять их не думал ? Нет тела - нет дела.
2. Читаем SQLite - CREATE TRIGGER.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 952
Рейтинг: 4
#1324: 2015-01-05 21:54:06 ЛС | профиль | цитата
Запрос SELECT max(nomerz)+1 FROM baza WHERE dataz > date('%1');
Где %1 это 2014-12-31, загружается из ини-файла.
Приходит Новый год, заявки надо нумеровать снова с 1. Этот запрос выводит пустоту. Я так понимаю потому что он не может найти dataz > date('%1'); ведь новых заявок нет еще.
....Что бы придумать?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1325: 2015-01-05 22:34:52 ЛС | профиль | цитата
1. dataz в каком формате ?
2.
user_asm писал(а):
Приходит Новый год
ну и сравнивай год, а не дату.
3. Сегодня год: SELECT strftime('%Y','now');
4. Как ты сам определил, что новый год и нужно начать нумерацию с 1 ? Вот так и составь запрос. Один к одному.
делается на раз, одним запросом и без костылей в виде ini-файлов
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 952
Рейтинг: 4
#1326: 2015-01-06 22:43:28 ЛС | профиль | цитата
Ну как бы надо от чего то отталкиваться. Т.е.:
1. Надо посмотреть дату последней записи.
2. Сравнить год последней записи и текущий год.
3. Если текущий год больше то присвоить записи номер 1.

Как-то так ..... Вопрос еще в том что стоит ли делать этот запрос при последующих внесениях новых заявок? На мой взгляд он будет мешать.
Либо, как вариант, после действия 3 выкидывать месагу что это первая запись в году и она осуществляется только с одобрения админа.
Но тут тоже вопрос - да, на форме можно реализовать чекбокс "Админ" и таким образом пустить ход выполнения на другой путь.
Примерно так:
code_34851.txt

вопрос в том что я не уверен в правильности этой схемы.
карма: 0

0
файлы: 1code_34851.txt [500B] [422]
Ответов: 16884
Рейтинг: 1239
#1327: 2015-01-06 23:00:04 ЛС | профиль | цитата
1. Надо посмотреть max(год) в таблице, т.к. в таблице могут быть записи за несколько лет.
2. Сравнить этот max(год) с текущим
3. Если равен текущему - значит старый год, если неравен текущему значит - новый год
Вот как-то так:
sql_zap.rar
Пришлось заархивировать, т.к. форум искажает запрос.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
файлы: 1sql_zap.rar [471B] [375]
Голосовали:user_asm
Ответов: 952
Рейтинг: 4
#1328: 2015-01-06 23:49:29 ЛС | профиль | цитата
Сейчас у меня реализована такая схема.
1. После заполнения всех соответвующих окошек формы внесения нового заявления юзер жмет Сохранить.
2. Идет запрос в БД SELECT max(nomerz)+1 FROM baza WHERE dataz > date('%1'); где %1 это 2014-12-31, загружается из ини-файла. Полученный ответ подставляется в компонент Edit на форме.
3. Выполняется основной запрос в БД INSERT INTO baza values("%1", "%2","%3", и т.д.
Т.е. сейчас как я говорил в п.2 получаем 0 в ответ, и в БД вносится чепуха.
Выход нашел корявый - 1 запись в году водить вручную, самому.
Проблемка еще в том что из-за кривой локальной сети (файл БД расположен на сервере в расшареной папке), запросы идут ооочень медленно, что сказывается на быстродействии программы.
Т.е. мне нужно максимально оптимизировать запросы ....
карма: 0

0
Ответов: 655
Рейтинг: 18
#1329: 2015-01-20 23:30:40 ЛС | профиль | цитата
Подскажите как лучше всего хранить даты в БД? Где-то в этой ветке была информация что лучше хранить в REAL.

допустим таблица data

id int, dt1 real -дата начала, dt2 real - дата окончания.

2015-01-10 12:30:15> 3307.52100694444
2015-01-11 12:50:00> 3672.53472222222

Правильно ли я пониманию что для нахождения всех id dt1 (дата начала) которых входит в некий диапазон дат нужно сделать запрос такого вида:

select id from data where dt1 between 3307 and 3672; (в данном случае только год-месяц-число без времени)



карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1330: 2015-01-21 18:15:49 ЛС | профиль | цитата
Gunnman писал(а):
как лучше всего хранить даты в БД?
Что значит лучшехуже ? Храни так как тебе нужно.
Если нужны часы,минуты, секунды - тогда TEXT или REAL.
Если не нужны - тогда TEXT или INTEGER.
tost_1.jpg

Имею желание купить дом, но не имею возможности. Имею возможность купить козу, но... не имею желания.
Так выпьем за то, чтобы наши желания всегда совпадали с нашими возможностями...
И не забывать, что SQLite ведёт отсчет от 4714 года до н.э.(REAL и INTEGER) Кстати, между 3307 и 3672 разница не в один день(твои даты 2015-01-10 и 2015-01-11), а в целый год.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1tost_1.jpg [33.8KB] [899]
Ответов: 655
Рейтинг: 18
#1331: 2015-01-21 21:37:23 ЛС | профиль | цитата
Tad, как это разница в 1 год???

т.е 3307.52100694444 = 2015-01-10 12:30:15
и 3672.53472222222 = 2015-01-11 12:50:00

а 3307 это не 2015-01-10 и 3672 не 2015-01-11? или я что-то упустил?

вот схема code_34958.txt

карма: 0

0
файлы: 1code_34958.txt [240B] [518]
Ответов: 16884
Рейтинг: 1239
#1332: 2015-01-21 22:21:28 ЛС | профиль | цитата
Упустил.
Найди отличие.
code_34960.txt

Дата REAL: целая часть - число дней от точки отсчета, дробная - часть суток.


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 2code_34960.txt [293B] [505], gunnman_2.png [16.5KB] [932]
Ответов: 655
Рейтинг: 18
#1333: 2015-01-21 22:45:29 ЛС | профиль | цитата
Tad, ох уж я внимательный спасибо!
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1334: 2015-01-21 22:56:41 ЛС | профиль | цитата
А вот так эти же даты видит SQLite :

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1gunnman_3.png [15.3KB] [980]
Ответов: 655
Рейтинг: 18
#1335: 2015-01-21 23:14:19 ЛС | профиль | цитата
Tad, а как такой результат в SQlite получить? и почему он их так видит?
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)