На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела C/C++: Базы данных
Модераторы: B.V.
  
    > SQL запрос
      Помогите с запром.
      DATA_IZM / FOREIGN_SOOTV_ADR / DOM
      21.10.2011/ 1 / 211
      24.10.2011/ 1 / 18
      23.10.2011/ 1 / 18

      После запроса должно получиться.
      DATA_IZM / FOREIGN_SOOTV_ADR / DOM
      21.10.2011/ 1 / 211
      24.10.2011/ 1 / 18

      т.е. DATA_IZM + (MAX(DATA_IZM) where OREIGN_SOOTV_ADR=1 AND DOM=18) AND where DATA_IZM <='30.10.2011'
      ExpandedWrap disabled
        select SSA.DATA_IZM, SSA.FOREIGN_SOOTV_ADR, SSA.DOM
        from SOOTV_SOTR_ADR SSA
        where SSA.DATA_IZM<='30.10.2011'


      Добавлено
      ExpandedWrap disabled
        select DATA_IZM, SSA.FOREIGN_SOOTV_ADR, SSA.DOM
        from SOOTV_SOTR_ADR SSA
        where SSA.DOM=SSA.DOM
        AND SSA.FOREIGN_SOOTV_ADR=SSA.FOREIGN_SOOTV_ADR
        AND SSA.DATA_IZM<='30.10.2011'  
        AND (SSA.DATA_IZM=(select MAX(DATA_IZM) from SOOTV_SOTR_ADR SSA where SSA.DOM=SSA.DOM AND SSA.FOREIGN_SOOTV_ADR=SSA.FOREIGN_SOOTV_ADR))

      Таким образом выдает только значения, где дата максимальна. :(
        может так надо?
        ExpandedWrap disabled
          select
           max(DATA_IZM),
           FOREIGN_SOOTV_ADR,
           DOM
          from
           SOOTV_SOTR_ADR
          where
           DATA_IZM<='30.10.2011'
          group by
           FOREIGN_SOOTV_ADR,
           DOM;
        Сообщение отредактировано: grgdvo -
          Спасибо:)
          Может подскажите еще под одному вопросу. в Grid выводится результат запроса (2 строки). Нужно переписать значения полученных строк на новую дату. Перезаписывается только первая строка. Что нужно изменить, чтоб записывались и остальноые строки, типа пока не конец.
          ExpandedWrap disabled
            void __fastcall TFrame_SH_SOTR::bbtNaDatuClick(TObject *Sender)
            {
            int IRow=1;
            int SOTR=StrToInt(dmOne->Val1_po_Val2("SPR_SOTR","KOD","NAIM",cbSotr->Text));
            dmOne->IBQTwo->SQL->Text="update or insert into SOOTV_SOTR_ADR (DATA_IZM, FORIGN_SPR_SOTR, DOM, FOREIGN_SOOTV_ADR)"
            " values (:DATA,:SOTR,:DOM,:ADRES)";
            dmOne->IBQTwo->ParamByName("DATA")->AsString=dtpProsm->Date;
            dmOne->IBQTwo->ParamByName("SOTR")->AsInteger=SOTR;
            dmOne->IBQTwo->ParamByName("DOM")->AsString=sgUth->Cells[2][IRow];
            dmOne->IBQTwo->ParamByName("ADRES")->AsString=sgUth->Cells[6][IRow];
             try {
                 dmOne->IBQTwo->Prepare();
                 dmOne->IBQTwo->ExecSQL();
                 dmOne->IBTROne->Commit();
                 dmOne->IBQTwo->Close();
                 cbSotrExit(Sender);
                 MessageDlg("Данные сохранены.", mtInformation,TMsgDlgButtons()<<mbOK ,0);
              } catch (...) {
                 MessageDlg("Изменения не сохранены!",
                      mtError,TMsgDlgButtons()<<mbOK ,0);
              }
            }
            вероятно надо в запрос UPDATE добавить условие WHERE и сделать цикл по строкам (насколько я понял у вас это IRow).

            ExpandedWrap disabled
              for (IRow = 1; IRow < !!!MAX?!!!; IRow++)
              {
              ... SQL->Text = ...
              UPDATE sootv_sotr_adr SET DATA_IZM=:DATA AND DOM=:DOM WHERE FOREIGN_SPR_SOTR=:SORT AND FOREIGN_SOOTV_ADR=:ADRES
              ...
              }


            Не знаю вашей модели данных, поэтому написал наугад.
            Вам потребуется изенить содержимое для SET и WHERE
            под ваши условия.

            И еще "update or insert" плохой оператор.
            Не знаю какую СУБД вы используете, но надежнее и понятнее
            будет отдельно делать либо insert, либо update.

            В вашем случае, как я понял, нужен только update, так данные уже есть в таблице
            Цитата
            Нужно переписать значения полученных строк на новую дату.
              Может кто поможет с запросом.
              ExpandedWrap disabled
                {
                int IRowM=1;
                dmOne->ClearGrid(sgTarif);
                sgTarif->ColCount=2;
                  sgTarif->Cells[0][0]="Дата";
                  sgTarif->Cells[1][0]="Тариф";
                  int NOM=StrToInt(edNom->Text);
                  dmOne->IBQTwo->SQL->Text="select * from GET_TARIF(:NOM,'01.01.1000','NOW') ";
                  dmOne->IBQTwo->ParamByName("NOM")->Value=NOM;
                    dmOne->IBQTwo->Prepare();
                 dmOne->IBQTwo->Active=true;
                 while (!dmOne->IBQTwo->Eof) {
                 sgTarif->Cells[0][IRowM]=dmOne->IBQTwo->FieldByName("DAT_TARIF")->AsString;
                 sgTarif->Cells[1][IRowM]=dmOne->IBQTwo->FieldByName("NAIM_TR")->AsString;
                 dmOne->IBQTwo->Next();
                IRowM++;
                }
                dmOne->IBQTwo->Close();
                }

              Получаем значение только первой строки из таблицы. По циклу ходит,но значения следующих строк не выводятся. <_<
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0266 ]   [ 15 queries used ]   [ Generated: 19.05.24, 06:53 GMT ]