Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 4 раз(а), последний 2021-05-21 07:58:55 |
|||
карма: 0 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 4 раз(а), последний 2021-05-21 07:58:55 |
|||
карма: 0 |
|
Ответов: 413
Рейтинг: 57
|
|||
Добрый вечер!
[flood] Подскажите как правильно вызвать число строк в таблице? Создаю базу так: CREATE TABLE if not exists reshenia(id integer primary key AUTOINCREMENT, nom_res char, dat_utv char,. . .); Затем пытаюсь узнать id последней строки. Так вызвал значения всей колонки: SELECT id FROM 'reshenia' Ранее в этой теме была такая запись: Tad писал(а): SELECT seq FROM sqlite_sequence WHERE name="имя таблицы";пытался так: SELECT seq FROM sqlite_sequence WHERE name='reshenia' но результата нет. Однако так вроде выдает: SELECT seq FROM sqlite_sequence правильно ли это и будет ли работать если в базе будет более одной таблицы? После создания второй таблицы в базе заработало так: SELECT seq FROM sqlite_sequence WHERE name="reshenia"; По видимому из-за наличия лиш одной таблицы в базе и не хотела работать ранее с указанием имени таблицы.[/flood] Прошу прощения за флуд. |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Poputchik писал(а): Затем пытаюсь узнать id последней строки. Так вызвал значения всей колонки:
SELECT id FROM 'reshenia' SELECT id FROM 'reshenia' - это не число строк в таблице. Даже SELECT max(id) FROM 'reshenia' - тоже не число строк в таблице. poputchik_1.png |
|||
карма: 25 |
| ||
файлы: 1 | poputchik_1.png [11KB] [872] |
Ответов: 413
Рейтинг: 57
|
|||
Tad писал(а): SELECT id FROM 'reshenia' - это не число строк в таблице.если отсчет первой строки начался с единицы и приращение будет автоматически на единицу, то должно совпадать с числом строк в таблице. Можно ли прописать в запросе проверку на несовпадение значений по нескольким колонкам при добавлении строки в таблицу и при выполнении условия добавлять, а иначе выдавать сообщение. Или лучше проверять запросом на поиск подобной сохраняемой строке и уже в зависимости от нахождения или нет средствами HiAsm выводить сообщение (как правильнее?) |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Poputchik писал(а): если отсчет первой строки начался с единицы и приращение будет автоматически на единицу, то должно совпадать с числом строк в таблице. Потом удалили первых 50 строк. Наибольшее id = 100, а строк всего 50. Самый надежный способ - это SELECT count() FROM 'reshenia' Насчет проверки на повтор. Если значение в колонке ни в коем случае не должно повторяться, то при CREATE TABLE указать для колонки, например : <имя колонки> TEXT UNIQUE Плох не тот, кто не знает, а тот, кто не хочет знать. |
|||
карма: 25 |
|
Ответов: 413
Рейтинг: 57
|
|||
Tad писал(а): Самый надежный способ - это SELECT count() FROM 'reshenia'Спасибо! завтра попробую так и сделать. Tad писал(а): Если значение в колонке ни в коем случае не должно повторяться, то при CREATE TABLE указать для колонки, например : <имя колонки> TEXT UNIQUEэто тоже пригодится, но у меня чуточку иная задача: мне нужно чтоб одновременно по нескольким колонкам не было совпадений, а по одной могут повторятся. Т.е., к примеру у меня 10 колонок из них: название, номер, дефект могут повторятся, а вот название, номер, дефект и дата не должны и такая строка не должна быть добавлена в базу (это что бы одну и ту же запись не внесли многократно, но возможно пользователь внес в другие поля изменения и хочет заменить существующую запись. Соответственно мне нужно уведамить его о совпадении и предложить перезаписать, добавить или отменить добавление). Сейчас я пытаюсь это сделать так:
|
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
SELECT count() FROM tabl WHERE название||номер||дефект||дата="Втулка+123+Трещина+20-05-2014";
Потом проверяешь результат : если =0 то разрешаешь сделать INSERT иначе предлагаешь "Отменить" или UPDATE ------------ Дoбавленo в 10.45: Посмотрел твой код. На форме ввода данных nom_izd и nd_akt должны вводиться первыми. Сразу после ввода по onChange выполняешь SELECT * FROM Reshenia WHERE nom_izd||nd_akt="%1%2"; (строка в первом FormatStr) и результат (если есть такой) разбрасываешь по окнам ввола и запрещаешь кнопки "Добавить" и "Сохранить". Т.е. пользователь сразу видит, есть такое или нет. Контролируешь точки onChange у всех окон ввода. Если были изменения, то разрешаешь кнопку "Сохранить". Кнопка "Отказаться" всегда активна и просто очищает окна ввода. Для более точной подсказки не помешало бы увидеть твоё CREATE TABLE Reshenia с комментариями к кождой колонке. примерно так
|
|||
карма: 25 |
| ||
Голосовали: | Poputchik |
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 4 раз(а), последний 2021-05-21 07:58:55 |
|||
карма: 0 |
|
Ответов: 704
Рейтинг: 44
|
|||
г. Григорий писал(а): на запрос SELECT * FROM ZCH WHERE nameid > 23456 ответа нетуА вы что хотели увидеть в результате? Естественно что результат будет нулевой. Потому что больше 23456 нет значения в бд. И соответственно возвращает Null. |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Kazbek17 писал(а): И соответственно возвращает Null.А ему зачем-то понадобилось событие. Решается только схемно или предварительным запросом:
|
|||
карма: 25 |
|
Ответов: 413
Рейтинг: 57
|
|||
Добрый вечер!
Tad писал(а): Сразу после ввода по onChange выполняешь SELECT * FROM Reshenia WHERE nom_izd||nd_akt="%1%2"; (строка в первом FormatStr)и результат (если есть такой) разбрасываешь по окнам ввола и запрещаешь кнопки "Добавить" и "Сохранить". Т.е. пользователь сразу видит, есть такое или нет. есть загвоздочки, например если человек вводит номер который в себе содержит ранее введенный номер (например 1234 содержит в себе 123) то считывание из базы и заполнение полей произойдет в момент ввода 123, что соответствует другой строке в базе. Но идея мне понравилась. Спасибо! Думаю немного видоизменю под себя и будет самое то. Tad писал(а): Для более точной подсказки не помешало бы увидеть твоёCREATE TABLE Reshenia Создаю ее такой командой: CREATE TABLE if not exists reshenia(id integer primary key AUTOINCREMENT, nom_res char, . . . ) где: id - нумерация строк, с возможностью изменения пользователем, т.к. может быть необходимо пропустить какой то номер. nom_res и остальные колонки char. В основном в них будет текст за исключением двух с которыми я еще не знаю как мне быть. А именно это колонка в которой будет содержаться многострочный текст преобразованный в строку с разделителем. Как его (многострочный тест) лучше хранить в базе не знаю. Но мне нужна возможность поиск по нем дат. Может как-то иначе это нужно делать, например сохранять в отдельную колонку даты, но тогда его (многострочный текст) нужно еще перед сохранением на даты проверять и при нахождении в отдельный столбец базы записывать. Мне нужно сравнивать дату в этой колонке с текущей и выводить сообщение если остался один день до ее наступления. Хотелось бы средствами базы это реализовать (имею ввиду поиск и сравнение дат. Отсюда возникает вопрос: в каком формате хранить даты (какой тип данных для колонки) и как их сравнивать чтоб база понимала, что сравниваются даты а не строки? |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Poputchik писал(а): id - нумерация строк, с возможностью изменения пользователемPoputchik писал(а): т.к. может быть необходимо пропустить какой то номер.Poputchik писал(а): id integer primary key AUTOINCREMENT |
|||
карма: 25 |
|
Ответов: 413
Рейтинг: 57
|
|||
Tad писал(а): Тогда зачем Poputchik писал(а)id integer primary key AUTOINCREMENT что бы приращение было автоматическим к последнему внесенному номеру строки. (По умолчанию нумерация сквозная начиная с 1, но возможны случаи когда документ под номером был, но его не внесли в базу и чтоб следующий документ имел правильную нумерацию ему в ручную можно изменить ее) Возможно я что-то не верно делаю. сравнить даты в базе Sqlite возможно? На одном сайте нашел вот такую запись: [flood] sqlite> create table t (dt_system text); sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '-3 day')); sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '-2 day')); sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '-1 day')); sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '0 day')); sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '1 day')); sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '2 day')); sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '3 day')); sqlite> select * from t; 2011.01.27 01:12:10 2011.01.28 01:12:15 2011.01.29 01:12:18 2011.01.30 01:12:22 2011.01.31 01:12:26 2011.02.01 01:12:29 2011.02.02 01:12:32 sqlite> select * from t where strftime('%Y.%m.%d %H:%M:%S', 'now') >= dt_system; 2011.01.27 01:12:10 2011.01.28 01:12:15 2011.01.29 01:12:18 2011.01.30 01:12:22 sqlite> select * from t where strftime('%Y.%m.%d %H:%M:%S', 'now') <= dt_system; 2011.01.31 01:12:26 2011.02.01 01:12:29 2011.02.02 01:12:32[/flood] не знаю рабочая или нет и как будет грамотнее если возможно. Мне нужно уведомлять пользователя о том, что до окончания срока остался день. |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
select * from tabl where strftime('%Y.%m.%d', 'now','+1 day', 'localtime') -- это текущая дата + 1 день (т.е. завтра)
= <имя колонки с твоей датой в формате '%Y.%m.%d'>; Если у тебя дата в другом формате, то измени строку формата в функции strftime(). |
|||
карма: 25 |
|