как из DatePicker передать дату на контроллер и вставить в запрос
From Product__c WHERE Date__c = 2018-02-27 вот к такому виду как привести то, что приходит с view
From Product__c WHERE Date__c = :searchDate '; вот сюда
<apex:inputText value="{!searchDate}" size="10" id="demo" onfocus="DatePicker.pickDate(false, this , false);"/>
вот так приходит
2018-02-27 00:00:00
а надо
2018-02-27
date d = date.parse(searchDate);
вот эта штука не работает
как из DatePicker передать дату на контроллер и вставить в запрос From Product__c WHERE Date__c = 2018-02-27 вот к такому виду как привести то, что приходит с view From Product__c WHERE Date__c = :searchDate '; вот сюда <apex:inputText value="{!searchDate}" size="10" id="demo" onfocus="DatePicker.pickDate(false, this , false);"/> вот так приходит 2018-02-27 00:00:00 а надо 2018-02-27 date d = date.parse(searchDate); вот эта штука не работает
Date.valueOf('2018-02-27 00:00:00')
Date.valueOf('2018-02-27 00:00:00')
Date.valueOf('2018-02-27 00:00:00')возвращает 2018-02-27 00:00:00
[quote="Dmitry Lisovsky"]Date.valueOf('2018-02-27 00:00:00')[/quote] Date.valueOf('2018-02-27 00:00:00')возвращает 2018-02-27 00:00:00
Ну так у тебя дата попадает в контроллер в переменную с типом Date
и есть такой запрос
From Product__c WHERE Date__c = :searchDate
Что еще надо? Зачем приводить к текстовому виду и динамическому соклу?
Ну так у тебя дата попадает в контроллер в переменную с типом Date и есть такой запрос From Product__c WHERE Date__c = :searchDate Что еще надо? Зачем приводить к текстовому виду и динамическому соклу?
то что приходит с view имеет вид 2018-02-27 00:00:00
запрос вида WHERE Date__c = 2018-02-27 00:00:00 не работает
работает вида WHERE Date__c = 2018-02-27
[quote="Dmitry Shnyrev"]Date[/quote] то что приходит с view имеет вид 2018-02-27 00:00:00 запрос вида WHERE Date__c = 2018-02-27 00:00:00 не работает работает вида WHERE Date__c = 2018-02-27
Что значит
"то что приходит с view имеет вид 2018-02-27 00:00:00"
Где ты это видишь? В debug logs?
Попробуй вывести
SYSTEM.DEBUG('XXXXX: '+Date.today());
что он покажет.
Или дата с view приходит в переменную String?
Выше показали как распарсить ее в Date
А дальше переменную с типом Date подставляешь в SOQL который я указал выше. Не важно как эта переменная в логах выводится.
Что значит "то что приходит с view имеет вид 2018-02-27 00:00:00" Где ты это видишь? В debug logs? Попробуй вывести SYSTEM.DEBUG('XXXXX: '+Date.today()); что он покажет. Или дата с view приходит в переменную String? Выше показали как распарсить ее в Date А дальше переменную с типом Date подставляешь в SOQL который я указал выше. Не важно как эта переменная в логах выводится.
Не надо использовать текстовое значение из переменной в SOQL, надо использовать сами переменные
Не надо использовать текстовое значение из переменной в SOQL, надо использовать сами переменные https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_SOQL_variables.htm
Или дата с view приходит в переменную String?
Выше показали как распарсить ее в Date
А дальше переменную с типом Date подставляешь в SOQL который я указал выше. Не важно как эта переменная в логах выводится.
я так и делал, но что-то все равно не идет. Где у меня ошибка?
Допустим отсюда приходит в переменную типа Date searchDateProduct
<apex:inputText value="{!searchDate}" size="10" id="demo" onfocus="DatePicker.pickDate(false, this , false);"/>
а вот контроллер
public ApexPages.StandardSetController setCon {
get{
if(setCon == null){
size = 10;
if (inputNameSearch == NULL){
inputNameSearch = '';
}
String searchVal ='%' + inputNameSearch + '%';
String str = '';
if(searchDateProduct != Null){
str = ' AND Date__c = :searchDateProduct ';
}
string queryString = 'SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Name__c like :searchVal OR Name__c = null '+ str;
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(queryString));
setCon.setPageSize(size);
noOfRecords = setCon.getResultSize();
}
return setCon;
}set;
}
[quote="Dmitry Shnyrev"]Что значит "то что приходит с view имеет вид 2018-02-27 00:00:00" Где ты это видишь? В debug logs? Попробуй вывести SYSTEM.DEBUG('XXXXX: '+Date.today()); что он покажет. Или дата с view приходит в переменную String? Выше показали как распарсить ее в Date А дальше переменную с типом Date подставляешь в SOQL который я указал выше. Не важно как эта переменная в логах выводится.[/quote] я так и делал, но что-то все равно не идет. Где у меня ошибка? Допустим отсюда приходит в переменную типа Date searchDateProduct <apex:inputText value="{!searchDate}" size="10" id="demo" onfocus="DatePicker.pickDate(false, this , false);"/> а вот контроллер public ApexPages.StandardSetController setCon { get{ if(setCon == null){ size = 10; if (inputNameSearch == NULL){ inputNameSearch = ''; } String searchVal ='%' + inputNameSearch + '%'; String str = ''; if(searchDateProduct != Null){ str = ' AND Date__c = :searchDateProduct '; } string queryString = 'SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Name__c like :searchVal OR Name__c = null '+ str; setCon = new ApexPages.StandardSetController(Database.getQueryLocator(queryString)); setCon.setPageSize(size); noOfRecords = setCon.getResultSize(); } return setCon; }set; }
А что не идет?
Не показываются Продукты за определенную дату или вообще ничего не покатывается?
Не вижу где у тебя объявляется searchDateProduct и как searchDate которая String судя по куску из Visualforce преобразуется в searchDateProduct.
Сделай так.
В лог выведи queryString (перед стройкой с Database.getQueryLocator) и searchDateProduct и закинь сюда.
ЗЫ: чтобы код вставить в сообщение попробуй пользоваться (code) (/code) (круглые на квадратные скобки только замени) (последней иконка в редакторе)
А что не идет? Не показываются Продукты за определенную дату или вообще ничего не покатывается? Не вижу где у тебя объявляется searchDateProduct и как searchDate которая String судя по куску из Visualforce преобразуется в searchDateProduct. Сделай так. В лог выведи queryString (перед стройкой с Database.getQueryLocator) и searchDateProduct и закинь сюда. ЗЫ: чтобы код вставить в сообщение попробуй пользоваться (code) (/code) (круглые на квадратные скобки только замени) (последней иконка в редакторе)
Не показываются Продукты за определенную дату или вообще ничего не покатывается?
Не вижу где у тебя объявляется searchDateProduct и как searchDate которая String судя по куску из Visualforce преобразуется в searchDateProduct.
Сделай так.
В лог выведи queryString (перед стройкой с Database.getQueryLocator) и searchDateProduct и закинь сюда.
ЗЫ: чтобы код вставить в сообщение попробуй пользоваться
(последней иконка в редакторе)
вот дебаг
SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Name__c like :searchVal OR Name__c = null AND Date__c = :searchDateProduct
а вот код страницы
<apex:pageBlock title="Search product">
<pr>Name search </pr>
<apex:inputText value="{!inputNameSearch}"/>
<pr>Date: </pr>
<apex:inputText value="{!searchDateProduct}" size="10" id="demo" onfocus="DatePicker.pickDate(false, this , false);"/>
<apex:commandButton action="{!SearchProduct}" value="Search" rerender="form" status="SearchStatus"/>
<apex:actionStatus id="SearchStatus">
<apex:facet name="start"><img src="/img/loading.gif" alt="" /></apex:facet>
<apex:facet name="stop"></apex:facet>
</apex:actionStatus>
</apex:pageBlock>
и код контроллера
public ApexPages.StandardSetController setCon {
get{
if(setCon == null){
size = 10;
if (inputNameSearch == NULL){
inputNameSearch = '';
}
String searchVal ='%' + inputNameSearch + '%';
String str = '';
if(searchDateProduct != Null){
str = ' AND Date__c = :searchDateProduct ';
}
string queryString = 'SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Name__c like :searchVal OR Name__c = null '+ str;
system.debug(queryString);
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(queryString));
setCon.setPageSize(size);
noOfRecords = setCon.getResultSize();
}
return setCon;
}set;
}public void SearchProduct() {
setCon = null;
setCon.setPageNumber(1);}
[quote="Dmitry Shnyrev"]А что не идет? Не показываются Продукты за определенную дату или вообще ничего не покатывается? Не вижу где у тебя объявляется searchDateProduct и как searchDate которая String судя по куску из Visualforce преобразуется в searchDateProduct. Сделай так. В лог выведи queryString (перед стройкой с Database.getQueryLocator) и searchDateProduct и закинь сюда. ЗЫ: чтобы код вставить в сообщение попробуй пользоваться [code][code][/code][/code] (последней иконка в редакторе)[/quote] вот дебаг SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Name__c like :searchVal OR Name__c = null AND Date__c = :searchDateProduct а вот код страницы[code] <apex:pageBlock title="Search product"> <pr>Name search </pr> <apex:inputText value="{!inputNameSearch}"/> <pr>Date: </pr> <apex:inputText value="{!searchDateProduct}" size="10" id="demo" onfocus="DatePicker.pickDate(false, this , false);"/> <apex:commandButton action="{!SearchProduct}" value="Search" rerender="form" status="SearchStatus"/> <apex:actionStatus id="SearchStatus"> <apex:facet name="start"><img src="/img/loading.gif" alt="" /></apex:facet> <apex:facet name="stop"></apex:facet> </apex:actionStatus> </apex:pageBlock>[/code] и код контроллера [code] public ApexPages.StandardSetController setCon { get{ if(setCon == null){ size = 10; if (inputNameSearch == NULL){ inputNameSearch = ''; } String searchVal ='%' + inputNameSearch + '%'; String str = ''; if(searchDateProduct != Null){ str = ' AND Date__c = :searchDateProduct '; } string queryString = 'SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Name__c like :searchVal OR Name__c = null '+ str; system.debug(queryString); setCon = new ApexPages.StandardSetController(Database.getQueryLocator(queryString)); setCon.setPageSize(size); noOfRecords = setCon.getResultSize(); } return setCon; }set; } public void SearchProduct() { setCon = null; setCon.setPageNumber(1); } [/code]
Код еще гляну детальнее, но вот что сразу бросилось в глаза
В секции WHERE OR и AND накиданы от балды.
OR надо взять в скобки чтобы сгрупировать условия и определить порядок.
Код еще гляну детальнее, но вот что сразу бросилось в глаза В секции WHERE OR и AND накиданы от балды. OR надо взять в скобки чтобы сгрупировать условия и определить порядок.
Это абсолютно ВЕСЬ код контроллера? с 1-й по последнюю строку?
Это абсолютно ВЕСЬ код контроллера? с 1-й по последнюю строку?
нет, вот весь
public class ContactPageController {
public Product__c pr {get;set;}
public Date searchDateProduct {get;set;}
public String myID{get;set;}
public String inputNameDel{get;set;}
public String inputNameSearch{get;set;}
public Integer noOfRecords{get; set;}
public Integer size{get;set;}
public List<Product__c> products { get{
return (List<Product__c>)setCon.getRecords();
} set; }public ContactPageController() {
pr = new Product__c();
}
public void deleteProduct(){
delete Database.query('SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Id = :myID');
}
public void insertProduct() {
try{
insert pr;
}
catch(DMLException e){
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, e.getDmlMessage(0)));
}
pr = new Product__c();}
public ApexPages.StandardSetController setCon {
get{
if(setCon == null){
size = 10;
if (inputNameSearch == NULL){
inputNameSearch = '';
}
String searchVal ='%' + inputNameSearch + '%';
String str = '';
if(searchDateProduct != Null){
str = ' AND Date__c = :searchDateProduct ';
}
string queryString = 'SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Name__c like :searchVal OR Name__c = null '+ str;
system.debug(queryString);
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(queryString));
setCon.setPageSize(size);
noOfRecords = setCon.getResultSize();
}
return setCon;
}set;
}public void SearchProduct() {
setCon = null;
setCon.setPageNumber(1);}
}
[quote="Dmitry Shnyrev"]Это абсолютно ВЕСЬ код контроллера? с 1-й по последнюю строку?[/quote] нет, вот весь [code]public class ContactPageController { public Product__c pr {get;set;} public Date searchDateProduct {get;set;} public String myID{get;set;} public String inputNameDel{get;set;} public String inputNameSearch{get;set;} public Integer noOfRecords{get; set;} public Integer size{get;set;} public List<Product__c> products { get{ return (List<Product__c>)setCon.getRecords(); } set; } public ContactPageController() { pr = new Product__c(); } public void deleteProduct(){ delete Database.query('SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Id = :myID'); } public void insertProduct() { try{ insert pr; } catch(DMLException e){ ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, e.getDmlMessage(0))); } pr = new Product__c(); } public ApexPages.StandardSetController setCon { get{ if(setCon == null){ size = 10; if (inputNameSearch == NULL){ inputNameSearch = ''; } String searchVal ='%' + inputNameSearch + '%'; String str = ''; if(searchDateProduct != Null){ str = ' AND Date__c = :searchDateProduct '; } string queryString = 'SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c From Product__c WHERE Name__c like :searchVal OR Name__c = null '+ str; system.debug(queryString); setCon = new ApexPages.StandardSetController(Database.getQueryLocator(queryString)); setCon.setPageSize(size); noOfRecords = setCon.getResultSize(); } return setCon; }set; } public void SearchProduct() { setCon = null; setCon.setPageNumber(1); } }[/code]
Не поглядишь что тут не так с запросом ?
[quote="Dmitry Shnyrev"]Код еще гляну детальнее, но вот что сразу бросилось в глаза В секции WHERE OR и AND накиданы от балды. OR надо взять в скобки чтобы сгрупировать условия и определить порядок.[/quote] Не поглядишь что тут не так с запросом ?
а можно код страницы тоже полностью?
а еще хотел спросить - как давно вы в SF и был ли какой опыт в IT до этого?
а можно код страницы тоже полностью? а еще хотел спросить - как давно вы в SF и был ли какой опыт в IT до этого?
<apex:page controller="ContactPageController">
<apex:includeScript value="{!URLFOR($Resource.Sorter, '/jquery-latest.js')}"/>
<apex:includeScript value="{!URLFOR($Resource.Sorter, '/jquery.tablesorter.min.js')}"/>
<apex:form id="form" >
<apex:pageBlock title="Search product">
<pr>Name search </pr>
<apex:inputText value="{!inputNameSearch}"/>
<pr>Date: </pr>
<apex:inputText value="{!searchDateProduct}" size="10" id="demo" onfocus="DatePicker.pickDate(false, this , false);"/>
<apex:commandButton action="{!SearchProduct}" value="Search" rerender="form" status="SearchStatus"/>
<apex:actionStatus id="SearchStatus">
<apex:facet name="start"><img src="/img/loading.gif" alt="" /></apex:facet>
<apex:facet name="stop"></apex:facet>
</apex:actionStatus>
</apex:pageBlock>
<apex:pageBlock title="Products">
<apex:pageMessages ></apex:pageMessages>
<apex:pageBlockTable id="Table" value="{!products}" var="row" styleClass="accTable" >
<apex:column headerValue="Action" >
<apex:outputLink title="" value="/{!row.id}/e?retURL=/apex/{!$CurrentPage.Name}" style="font-weight:bold">Edit</apex:outputLink>
</apex:column>
<apex:column headerValue="Action">
<apex:commandLink action="{!deleteProduct }" onclick="if(!confirm('Are you sure?')) return false;"
reRender="Table"><apex:param name="myID" assignTo="{!myID}" value="{!row.id}"/>Delete
</apex:commandLink>
</apex:column>
<apex:column headerValue="Product" value="{!row.Name__c}">
<apex:facet name="header">
<apex:commandLink reRender="Section">Product Name</apex:commandLink>
</apex:facet>
</apex:column>
<apex:column headerValue="Product" value="{!row.Price__c}">
<apex:facet name="header">
<apex:commandLink reRender="Section">Price</apex:commandLink>
</apex:facet>
</apex:column>
<apex:column headerValue="Product" value="{!row.Quantity__c}">
<apex:facet name="header">
<apex:commandLink reRender="Section">Quantity</apex:commandLink>
</apex:facet>
</apex:column>
<apex:column headerValue="Product" value="{!row.Type__c}">
<apex:facet name="header">
<apex:commandLink reRender="Section">Type</apex:commandLink>
</apex:facet>
</apex:column>
<apex:column headerValue="Product" value="{!row.Date__c}">
<apex:facet name="header">
<apex:commandLink reRender="Section">Date of adding</apex:commandLink>
</apex:facet>
</apex:column>
<apex:column headerValue="Product" value="{!row.Release_Date__c}">
<apex:facet name="header">
<apex:commandLink reRender="Section">Release Date</apex:commandLink>
</apex:facet>
</apex:column>
<apex:column headerValue="Product" value="{!row.Availability__c}">
<apex:facet name="header">
<apex:commandLink reRender="Section">Availability</apex:commandLink>
</apex:facet>
</apex:column></apex:pageBlockTable>
<apex:panelGrid columns="7">
<apex:commandButton action="{!setCon.first}" status="PaginationStatus" reRender="form" value="|<" disabled="{!!setCon.hasPrevious}" title="First Page"/>
<apex:commandButton action="{!setCon.previous}" status="PaginationStatus" reRender="form" value="<" disabled="{!!setCon.hasPrevious}" title="Previous Page"/>
<apex:commandButton action="{!setCon.next}" status="PaginationStatus" reRender="form" value=">" disabled="{!!setCon.hasNext}" title="Next Page"/>
<apex:commandButton action="{!setCon.last}" status="PaginationStatus" reRender="form" value=">|" disabled="{!!setCon.hasNext}" title="Last Page"/>
<apex:outputText >{!(setCon.pageNumber * size)+1-size}-{!IF((setCon.pageNumber * size)>noOfRecords, noOfRecords,(setCon.pageNumber * size))} of {!noOfRecords}</apex:outputText>
<apex:actionStatus id="PaginationStatus">
<apex:facet name="start"><img src="/img/loading.gif" alt="" /></apex:facet>
<apex:facet name="stop"></apex:facet>
</apex:actionStatus>
</apex:panelGrid>
</apex:pageBlock>
<apex:pageBlock id="block1">
<apex:pageBlockSection columns="1" collapsible="true" id="section1" >
<apex:pageBlockSection id="section2" columns="1" title="Add product">
<apex:pageBlockSection columns="1">
<apex:outputLabel value="Enter a description of the product:"/>
<apex:inputField label="Name:" value="{!pr.Name__c}"/>
<apex:inputField label="Price:" value="{!pr.Price__c}"/>
<apex:inputField label="Quantity of:" value="{!pr.Quantity__c}"/>
<apex:inputField label="Type:" value="{!pr.Type__c}"/>
<apex:inputField label="Date of add:" value="{!pr.Date__c}" />
<apex:inputField label="Release Date:" value="{!pr.Release_Date__c}" /> <apex:pageMessages />
<apex:commandButton value="Add product!" action="{!insertProduct}" rerender="form" ></apex:commandButton>
</apex:pageBlockSection>
</apex:pageBlockSection>
</apex:pageBlockSection>
</apex:pageBlock>
<script>
$(document).ready(function() {
$(".accTable").tablesorter();
});
</script>
</apex:form>
</apex:page>
[quote="Maxim Elets"]а можно код страницы тоже полность?[/quote] [code]<apex:page controller="ContactPageController"> <apex:includeScript value="{!URLFOR($Resource.Sorter, '/jquery-latest.js')}"/> <apex:includeScript value="{!URLFOR($Resource.Sorter, '/jquery.tablesorter.min.js')}"/> <apex:form id="form" > <apex:pageBlock title="Search product"> <pr>Name search </pr> <apex:inputText value="{!inputNameSearch}"/> <pr>Date: </pr> <apex:inputText value="{!searchDateProduct}" size="10" id="demo" onfocus="DatePicker.pickDate(false, this , false);"/> <apex:commandButton action="{!SearchProduct}" value="Search" rerender="form" status="SearchStatus"/> <apex:actionStatus id="SearchStatus"> <apex:facet name="start"><img src="/img/loading.gif" alt="" /></apex:facet> <apex:facet name="stop"></apex:facet> </apex:actionStatus> </apex:pageBlock> <apex:pageBlock title="Products"> <apex:pageMessages ></apex:pageMessages> <apex:pageBlockTable id="Table" value="{!products}" var="row" styleClass="accTable" > <apex:column headerValue="Action" > <apex:outputLink title="" value="/{!row.id}/e?retURL=/apex/{!$CurrentPage.Name}" style="font-weight:bold">Edit</apex:outputLink> </apex:column> <apex:column headerValue="Action"> <apex:commandLink action="{!deleteProduct }" onclick="if(!confirm('Are you sure?')) return false;" reRender="Table"><apex:param name="myID" assignTo="{!myID}" value="{!row.id}"/>Delete </apex:commandLink> </apex:column> <apex:column headerValue="Product" value="{!row.Name__c}"> <apex:facet name="header"> <apex:commandLink reRender="Section">Product Name</apex:commandLink> </apex:facet> </apex:column> <apex:column headerValue="Product" value="{!row.Price__c}"> <apex:facet name="header"> <apex:commandLink reRender="Section">Price</apex:commandLink> </apex:facet> </apex:column> <apex:column headerValue="Product" value="{!row.Quantity__c}"> <apex:facet name="header"> <apex:commandLink reRender="Section">Quantity</apex:commandLink> </apex:facet> </apex:column> <apex:column headerValue="Product" value="{!row.Type__c}"> <apex:facet name="header"> <apex:commandLink reRender="Section">Type</apex:commandLink> </apex:facet> </apex:column> <apex:column headerValue="Product" value="{!row.Date__c}"> <apex:facet name="header"> <apex:commandLink reRender="Section">Date of adding</apex:commandLink> </apex:facet> </apex:column> <apex:column headerValue="Product" value="{!row.Release_Date__c}"> <apex:facet name="header"> <apex:commandLink reRender="Section">Release Date</apex:commandLink> </apex:facet> </apex:column> <apex:column headerValue="Product" value="{!row.Availability__c}"> <apex:facet name="header"> <apex:commandLink reRender="Section">Availability</apex:commandLink> </apex:facet> </apex:column> </apex:pageBlockTable> <apex:panelGrid columns="7"> <apex:commandButton action="{!setCon.first}" status="PaginationStatus" reRender="form" value="|<" disabled="{!!setCon.hasPrevious}" title="First Page"/> <apex:commandButton action="{!setCon.previous}" status="PaginationStatus" reRender="form" value="<" disabled="{!!setCon.hasPrevious}" title="Previous Page"/> <apex:commandButton action="{!setCon.next}" status="PaginationStatus" reRender="form" value=">" disabled="{!!setCon.hasNext}" title="Next Page"/> <apex:commandButton action="{!setCon.last}" status="PaginationStatus" reRender="form" value=">|" disabled="{!!setCon.hasNext}" title="Last Page"/> <apex:outputText >{!(setCon.pageNumber * size)+1-size}-{!IF((setCon.pageNumber * size)>noOfRecords, noOfRecords,(setCon.pageNumber * size))} of {!noOfRecords}</apex:outputText> <apex:actionStatus id="PaginationStatus"> <apex:facet name="start"><img src="/img/loading.gif" alt="" /></apex:facet> <apex:facet name="stop"></apex:facet> </apex:actionStatus> </apex:panelGrid> </apex:pageBlock> <apex:pageBlock id="block1"> <apex:pageBlockSection columns="1" collapsible="true" id="section1" > <apex:pageBlockSection id="section2" columns="1" title="Add product"> <apex:pageBlockSection columns="1"> <apex:outputLabel value="Enter a description of the product:"/> <apex:inputField label="Name:" value="{!pr.Name__c}"/> <apex:inputField label="Price:" value="{!pr.Price__c}"/> <apex:inputField label="Quantity of:" value="{!pr.Quantity__c}"/> <apex:inputField label="Type:" value="{!pr.Type__c}"/> <apex:inputField label="Date of add:" value="{!pr.Date__c}" /> <apex:inputField label="Release Date:" value="{!pr.Release_Date__c}" /> <apex:pageMessages /> <apex:commandButton value="Add product!" action="{!insertProduct}" rerender="form" ></apex:commandButton> </apex:pageBlockSection> </apex:pageBlockSection> </apex:pageBlockSection> </apex:pageBlock> <script> $(document).ready(function() { $(".accTable").tablesorter(); }); </script> </apex:form> </apex:page>[/code]
В общем запрос вот такой должен быть. Так должно работать
SELECT
Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c
FROM
Product__c
WHERE
(Name__c LIKE :searchVal OR Name__c = null) AND
Date__c = :searchDateProduct
Попробуй просто в консоли сделать
Date searchDateProduct = Date.valueOf('2018-02-27 00:00:00'); // нужная тебе дата
String searchVal = '%ТоЧтоХочешьНайти|ЧастьИмени%';
List<Product__c> products = [...]; вместо ... запрос выше
SYSTEM.DEBUG('Total products: '+products.size());
Если будет больше 0 значит проблема не в запросе.
Если будет 0, то я даже не знаю что проверять дальше.
В общем запрос вот такой должен быть. Так должно работать [code] SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null) AND Date__c = :searchDateProduct [/code] Попробуй просто в консоли сделать [code] Date searchDateProduct = Date.valueOf('2018-02-27 00:00:00'); // нужная тебе дата String searchVal = '%ТоЧтоХочешьНайти|ЧастьИмени%'; List<Product__c> products = [...]; вместо ... запрос выше SYSTEM.DEBUG('Total products: '+products.size()); [/code] Если будет больше 0 значит проблема не в запросе. Если будет 0, то я даже не знаю что проверять дальше.
а еще хотел спросить - как давно вы в SF и был ли какой опыт в IT до этого?
Начал изучать недавно). Изучал java и потом SF
[quote="Maxim Elets"]а можно код страницы тоже полностью? а еще хотел спросить - как давно вы в SF и был ли какой опыт в IT до этого?[/quote] Начал изучать недавно). Изучал java и потом SF
А с чего ты взял, что дата не правильно работает? Ты пробовал запрос выполнить только с датой в WHERE и посмотреть, что возвращает?
Date d = Date.today();
System.debug(d);
09:53:30:001 USER_DEBUG [2]|DEBUG|2018-03-10 00:00:00
Date d = Date.today();
System.debug(d);
System.debug([SELECT CloseDate FROM Opportunity WHERE CloseDate = :d].size());
09:56:59:001 USER_DEBUG [2]|DEBUG|2018-03-10 00:00:00
09:56:59:050 USER_DEBUG [3]|DEBUG|18
А с чего ты взял, что дата не правильно работает? Ты пробовал запрос выполнить только с датой в WHERE и посмотреть, что возвращает? [code]Date d = Date.today(); System.debug(d);[/code] [code]09:53:30:001 USER_DEBUG [2]|DEBUG|2018-03-10 00:00:00[/code] [code]Date d = Date.today(); System.debug(d); System.debug([SELECT CloseDate FROM Opportunity WHERE CloseDate = :d].size()); [/code] [code]09:56:59:001 USER_DEBUG [2]|DEBUG|2018-03-10 00:00:00 09:56:59:050 USER_DEBUG [3]|DEBUG|18[/code]
Date d = Date.today();
System.debug(d);
09:53:30:001 USER_DEBUG [2]|DEBUG|2018-03-10 00:00:00
Date d = Date.today();
System.debug(d);
System.debug([SELECT CloseDate FROM Opportunity WHERE CloseDate = :d].size());
09:56:59:001 USER_DEBUG [2]|DEBUG|2018-03-10 00:00:00
09:56:59:050 USER_DEBUG [3]|DEBUG|18
да,спасибо, уже вроде разобрался
[quote="Andrii Muzychuk"]А с чего ты взял, что дата не правильно работает? Ты пробовал запрос выполнить только с датой в WHERE и посмотреть, что возвращает? [code]Date d = Date.today(); System.debug(d);[/code] [code]09:53:30:001 USER_DEBUG [2]|DEBUG|2018-03-10 00:00:00[/code] [code]Date d = Date.today(); System.debug(d); System.debug([SELECT CloseDate FROM Opportunity WHERE CloseDate = :d].size()); [/code] [code]09:56:59:001 USER_DEBUG [2]|DEBUG|2018-03-10 00:00:00 09:56:59:050 USER_DEBUG [3]|DEBUG|18[/code][/quote] да,спасибо, уже вроде разобрался
Вроде или разобрался? Работает как ожидается?
Вроде или разобрался? Работает как ожидается?
Появился другой вопрос насчет опять этого DatePickera
Если убрать со страницы
http://prntscr.com/ip7w1a тот что стрелочкой отмечен, перестает разворачиваться
DatePicker.pickDate(false, this , false);"
вот так это выглядит
[quote="Andrii Muzychuk"]Вроде или разобрался? Работает как ожидается?[/quote] Появился другой вопрос насчет опять этого DatePickera Если убрать со страницы http://prntscr.com/ip7w1a тот что стрелочкой отмечен, перестает разворачиваться DatePicker.pickDate(false, this , false);" вот так это выглядит http://prntscr.com/ip7we7
Так, что-то я этот момент упустил из виду.
Зачем такие извращения с DatePicker?
Мне почему-то кажется что ты где-то этот вариант скопипастил.
Так как ты используешь DatePicker не по назначению он у тебя собственно и перестает работать.
Смысл в том что изначально (когда работает) у тебя на странице есть стандартное поле типа Date ("Date of add") поэтому SF подгружает и инициализирует DatePicker.
Второе поле ты просто на onFocus напрямую дергаешь незадокументированную функцию открытия DatePicker. Salesforce про это не догадывается и поэтому когда ты убираешь первое поле он DatePicker вообще не грузит на страницу за ненадобностью.
Рассказываю как в таких случаях надо поступать (это отличнейшее решение которое так просто не нагуглишь, а лишь узнаешь работая в опытной команде).
Надо использовать SObject (любой) в котором есть поле Date (тоже самое для Datetime).
К примеру берешь Contact.Birthdate
В конструкторе создаешь инстанс Contact и обзываешь его к примеру dummyContact;
а на странице делаешь
<apex:inputField value="dummyContact.Birthdate" />
Так, что-то я этот момент упустил из виду. Зачем такие извращения с DatePicker? Мне почему-то кажется что ты где-то этот вариант скопипастил. Так как ты используешь DatePicker не по назначению он у тебя собственно и перестает работать. Смысл в том что изначально (когда работает) у тебя на странице есть стандартное поле типа Date ("Date of add") поэтому SF подгружает и инициализирует DatePicker. Второе поле ты просто на onFocus напрямую дергаешь незадокументированную функцию открытия DatePicker. Salesforce про это не догадывается и поэтому когда ты убираешь первое поле он DatePicker вообще не грузит на страницу за ненадобностью. Рассказываю как в таких случаях надо поступать (это отличнейшее решение которое так просто не нагуглишь, а лишь узнаешь работая в опытной команде). Надо использовать SObject (любой) в котором есть поле Date (тоже самое для Datetime). К примеру берешь Contact.Birthdate В конструкторе создаешь инстанс Contact и обзываешь его к примеру dummyContact; а на странице делаешь [code]<apex:inputField value="dummyContact.Birthdate" />[/code] Salesforce видит что поле объекта с типом Date и тогда на его месте рендерится обычный стандартный input с повешенным на него DatePicker. В контроллере тоже все просто. Не надо никаких манипуляций с преобразованием даты из текста в Date. Можно сразу в SOQL подставлять someDateField = :dummyContact.Birthdate
Я как истинный поклонник JS изначально подумал что ты используешь какой-то сторонний JS DatePicker, а ты просто пытаешься хакнуть Visualforce
Я как истинный поклонник JS изначально подумал что ты используешь какой-то сторонний JS DatePicker, а ты просто пытаешься хакнуть Visualforce :)
Спасибо, но я так делал
<apex:inputField value="{!searchDateProduct.Date__c}" />
все было в принципе ок, но мне сказали вот что:
"Date Picker сделан с использованием dummy объекта, что не есть правильно."
поэтому я стал пытаться через такой datepicker
[quote="Dmitry Shnyrev"]<apex:inputField value="dummyContact.Birthdate" />[/quote] Спасибо, но я так делал <apex:inputField value="{!searchDateProduct.Date__c}" /> все было в принципе ок, но мне сказали вот что: "Date Picker сделан с использованием dummy объекта, что не есть правильно." поэтому я стал пытаться через такой datepicker
Вот это новость!
То есть создать стандартный инстанс объекта и вывести стандартным способом поле с датой (стандартный виджет который поддерживает таймзону и формат пользователя), получить в контроллере без каких либо преобразований переменную с типом Date это неправильно?
Я бы посмотрел на решение которое считается "правильным"!!!
[quote="cool"]"Date Picker сделан с использованием dummy объекта, что не есть правильно."[/quote] Вот это новость! То есть создать стандартный инстанс объекта и вывести стандартным способом поле с датой (стандартный виджет который поддерживает таймзону и формат пользователя), получить в контроллере без каких либо преобразований переменную с типом Date это неправильно? Я бы посмотрел на решение которое считается "правильным"!!! :D
Если хочешь чтобы твое решение работало при отсутствии поля "Date of add", то тогда совет - не удаляй его полностью со страницы, а просто скрой средствами CSS (оберни в div со стилем display:none). И тогда SF будет видеть что на странице используется поле с типом Date (которое скрыто от пользователя), и поэтому подгрузит сам Виджет. Который ты уже будешь использовать на onFocus
Если хочешь чтобы твое решение работало при отсутствии поля "Date of add", то тогда совет - не удаляй его полностью со страницы, а просто скрой средствами CSS (оберни в div со стилем display:none). И тогда SF будет видеть что на странице используется поле с типом Date (которое скрыто от пользователя), и поэтому подгрузит сам Виджет. Который ты уже будешь использовать на onFocus
однако, почему не правильно?
[quote="cool"]что не есть правильно[/quote] однако, почему не правильно?
Такой ответ дали в конторе,я не в курсе почему так не правильно
<apex:inputField value="{!searchDateProduct.Date__c}" />
[quote="Maxim Elets"][quote="cool"]что не есть правильно[/quote] однако, почему не правильно?[/quote] Такой ответ дали в конторе,я не в курсе почему так не правильно [code]<apex:inputField value="{!searchDateProduct.Date__c}" />[/code]
Такой ответ дали в конторе
Интересно, кто ж конторе дает такие ответы?
Наверное девочка HR?
[quote="cool"]Такой ответ дали в конторе[/quote] Интересно, кто ж конторе дает такие ответы? :D Наверное девочка HR?
известной. да hr, но вряд ли она сама до этого дошла
известной. да hr, но вряд ли она сама до этого дошла
известной) да hr, но вряд ли она сама до этого дошла
[quote="cool"]известной) да hr, но вряд ли она сама до этого дошла[/quote]
Не знаю кто принимал решение и чем руководствовался, но решение для стандартного Visualforce самое рабочее.
Вот как раз твой вариант неправильный потому что ты обращаешься из JS (onFocus) к недокументированной функции. А это как раз и есть плохо для настоящей Production разработки. Где гарантии что завтра функцию не переименуют? И твой продукт у клиента в самый час пик не перестанет работать после обновления SF?
Не знаю кто принимал решение и чем руководствовался, но решение для стандартного Visualforce самое рабочее. Вот как раз твой вариант неправильный потому что ты обращаешься из JS (onFocus) к недокументированной функции. А это как раз и есть плохо для настоящей Production разработки. Где гарантии что завтра функцию не переименуют? И твой продукт у клиента в самый час пик не перестанет работать после обновления SF?
Когда говорят что что-то не правильно, то говорят какой вариант использовать как правильный.
п.с. может они хотят не sobject на странице, а врапер для него? В самых первых workbook для Salesforce именно так было. Может и здесь такое требование.
Когда говорят что что-то не правильно, то говорят какой вариант использовать как правильный. п.с. может они хотят не sobject на странице, а врапер для него? В самых первых workbook для Salesforce именно так было. Может и здесь такое требование.
Так, что-то я этот момент упустил из виду.
Зачем такие извращения с DatePicker?
Мне почему-то кажется что ты где-то этот вариант скопипастил.
Так как ты используешь DatePicker не по назначению он у тебя собственно и перестает работать.
Смысл в том что изначально (когда работает) у тебя на странице есть стандартное поле типа Date ("Date of add") поэтому SF подгружает и инициализирует DatePicker.
Второе поле ты просто на onFocus напрямую дергаешь незадокументированную функцию открытия DatePicker. Salesforce про это не догадывается и поэтому когда ты убираешь первое поле он DatePicker вообще не грузит на страницу за ненадобностью.
Рассказываю как в таких случаях надо поступать (это отличнейшее решение которое так просто не нагуглишь, а лишь узнаешь работая в опытной команде).
Надо использовать SObject (любой) в котором есть поле Date (тоже самое для Datetime).
К примеру берешь Contact.Birthdate
В конструкторе создаешь инстанс Contact и обзываешь его к примеру dummyContact;
а на странице делаешь
<apex:inputField value="dummyContact.Birthdate" />
В итоге сделал как ты сказал - потому как с эти DatePicker еще начало всплывать куча всего...
<apex:inputField value="{!searchDateProduct.Birthdate}" />
String searchVal = '%'+(inputNameSearch == null ? '' : inputNameSearch)+'%';
List<Product__c> products = [SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null) AND Date__c = :searchDateProduct.Birthdate];
но показывает он ВСЕ строки только те, в которых нет поля Date__c -
String searchVal = '%'+(inputNameSearch == null ? '' : inputNameSearch)+'%';
List<Product__c> products = [SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null) ];
без AND Date__c = :searchDateProduct.Birthdate
в итоге так сдела - не знаю на сколько правильно это решение
List<Product__c> products;
if(searchDateProduct.Birthdate == null){
products = [SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null)];}
else{
products = [SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null) AND Date__c = :searchDateProduct.Birthdate];}
[quote="Dmitry Shnyrev"]Так, что-то я этот момент упустил из виду. Зачем такие извращения с DatePicker? Мне почему-то кажется что ты где-то этот вариант скопипастил. Так как ты используешь DatePicker не по назначению он у тебя собственно и перестает работать. Смысл в том что изначально (когда работает) у тебя на странице есть стандартное поле типа Date ("Date of add") поэтому SF подгружает и инициализирует DatePicker. Второе поле ты просто на onFocus напрямую дергаешь незадокументированную функцию открытия DatePicker. Salesforce про это не догадывается и поэтому когда ты убираешь первое поле он DatePicker вообще не грузит на страницу за ненадобностью. Рассказываю как в таких случаях надо поступать (это отличнейшее решение которое так просто не нагуглишь, а лишь узнаешь работая в опытной команде). Надо использовать SObject (любой) в котором есть поле Date (тоже самое для Datetime). К примеру берешь Contact.Birthdate В конструкторе создаешь инстанс Contact и обзываешь его к примеру dummyContact; а на странице делаешь [code]<apex:inputField value="dummyContact.Birthdate" />[/code] Salesforce видит что поле объекта с типом Date и тогда на его месте рендерится обычный стандартный input с повешенным на него DatePicker. В контроллере тоже все просто. Не надо никаких манипуляций с преобразованием даты из текста в Date. Можно сразу в SOQL подставлять someDateField = :dummyContact.Birthdate[/quote] В итоге сделал как ты сказал - потому как с эти DatePicker еще начало всплывать куча всего... [code] <apex:inputField value="{!searchDateProduct.Birthdate}" />[/code] вот с страницы приходит дата вот этот запрос [code] String searchVal = '%'+(inputNameSearch == null ? '' : inputNameSearch)+'%'; List<Product__c> products = [SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null) AND Date__c = :searchDateProduct.Birthdate]; [/code] но показывает он ВСЕ строки только те, в которых нет поля Date__c - [code] String searchVal = '%'+(inputNameSearch == null ? '' : inputNameSearch)+'%'; List<Product__c> products = [SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null) ]; [/code] без AND Date__c = :searchDateProduct.Birthdate в итоге так сдела - не знаю на сколько правильно это решение [code] List<Product__c> products; if(searchDateProduct.Birthdate == null){ products = [SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null)];} else{ products = [SELECT Name__c, Price__c, Quantity__c, Type__c, Date__c, Release_Date__c, Availability__c FROM Product__c WHERE (Name__c LIKE :searchVal OR Name__c = null) AND Date__c = :searchDateProduct.Birthdate];} [/code]
Когда говорят что что-то не правильно, то говорят какой вариант использовать как правильный.
п.с. может они хотят не sobject на странице, а врапер для него? В самых первых workbook для Salesforce именно так было. Может и здесь такое требование.
А можешь ссылку кинуть про это?
[quote="Developer"]Когда говорят что что-то не правильно, то говорят какой вариант использовать как правильный. п.с. может они хотят не sobject на странице, а врапер для него? В самых первых workbook для Salesforce именно так было. Может и здесь такое требование.[/quote] А можешь ссылку кинуть про это?
А можешь ссылку кинуть про это?
Workbook заменён на Trailhead
Не нашёл ссылки на старые документы.
п.с. тут вопрос не в ссылках, а в том, что надо выяснить требования, чтобы не заниматься гаданием.
[quote="cool"]А можешь ссылку кинуть про это?[/quote] Workbook заменён на Trailhead :) Не нашёл ссылки на старые документы. п.с. тут вопрос не в ссылках, а в том, что надо выяснить требования, чтобы не заниматься гаданием.
п.с. может они хотят не sobject на странице, а врапер для него?
Дело в том что враппер штука хорошая, но она используется для данных. В этом случае для Products.
Когда надо показать DatePicker для фильтра нафига там враппер? Там и SObject кажется излишним. Это костыль, по другому намного сложнее.
[quote="Developer"]п.с. может они хотят не sobject на странице, а врапер для него?[/quote] Дело в том что враппер штука хорошая, но она используется для данных. В этом случае для Products. Когда надо показать DatePicker для фильтра нафига там враппер? Там и SObject кажется излишним. Это костыль, по другому намного сложнее.
Когда надо показать DatePicker для фильтра нафига там враппер?
Может чтобы привести всё приложение к одному стилю?
1) Не будет длинных и зачастую уродских имён переменных, когда кто-то не знал как нормально назвать поле объекта.
2) Не будет __c, что тоже положительно сказывается на длине переменной
3) Не будет лишней метадаты передаваемой на страницу.
4) Можно добавлять любые переменные независимо от того есть такие поля на объекте или их нет.
и т.д.
А вообще view state на странице это зло и я его использовал только первые несколько месяцев, когда учил visualforce. :)
[quote="Dmitry Shnyrev"]Когда надо показать DatePicker для фильтра нафига там враппер?[/quote] Может чтобы привести всё приложение к одному стилю? 1) Не будет длинных и зачастую уродских имён переменных, когда кто-то не знал как нормально назвать поле объекта. 2) Не будет __c, что тоже положительно сказывается на длине переменной 3) Не будет лишней метадаты передаваемой на страницу. 4) Можно добавлять любые переменные независимо от того есть такие поля на объекте или их нет. и т.д. А вообще view state на странице это зло и я его использовал только первые несколько месяцев, когда учил visualforce. :)
Developer,
все эти 4 пункта звучат правильно!
Но задача по DatePicker для отдельного поля выпадает из этих правил потому что она уже и так является хаком для Visualforce. Не надо делать из какашки конфетку
И лучше пока не запутывать товарища cool на пути его внедрения в компанию в качестве junior.
Эти все правила придут с практикой.
Developer, все эти 4 пункта звучат правильно! Но задача по DatePicker для отдельного поля выпадает из этих правил потому что она уже и так является хаком для Visualforce. Не надо делать из какашки конфетку :) И лучше пока не запутывать товарища cool на пути его внедрения в компанию в качестве junior. Эти все правила придут с практикой.
Но задача по DatePicker для отдельного поля выпадает из этих правил потому что она уже и так является хаком для Visualforce.
Это точно не задача для джуниора выполняющего тестовое задание.
Надо себе упрощать работу, а не усложнять, иначе в спорных моментах по заданию ещё и завалить вопросами могут.
[quote="Dmitry Shnyrev"]Но задача по DatePicker для отдельного поля выпадает из этих правил потому что она уже и так является хаком для Visualforce.[/quote] Это точно не задача для джуниора выполняющего тестовое задание. Надо себе упрощать работу, а не усложнять, иначе в спорных моментах по заданию ещё и завалить вопросами могут.
"Date Picker сделан с использованием dummy объекта, что не есть правильно."
Шлите их подальше с таким ответом. Вариант который вы использовали и который озвучил Дмитрий - самый оптимальный и трушно форсовский. Реально у него единственное слабое место - field-level-security, когда пользователю просто не отрендерят input если у него на это прав нет. Но почему-то я сомневаюсь, что они именно это имели в виду, к тому же это всегда можно уточнить - а какой вообще уровень доступа у пользователя который использует этот поиск. Если от вас хотят JS-кунг-фу (а на это похоже, если вчитаться в комментарий внимательно) - тогда другой вопрос, тогда нужен кастомный Date Picker плюс парсинг строки в Date/Datetime на стороне контроллера.
[quote="cool"]"Date Picker сделан с использованием dummy объекта, что не есть правильно."[/quote] Шлите их подальше с таким ответом. Вариант который вы использовали и который озвучил Дмитрий - самый оптимальный и трушно форсовский. Реально у него единственное слабое место - field-level-security, когда пользователю просто не отрендерят input если у него на это прав нет. Но почему-то я сомневаюсь, что они именно это имели в виду, к тому же это всегда можно уточнить - а какой вообще уровень доступа у пользователя который использует этот поиск. Если от вас хотят JS-кунг-фу (а на это похоже, если вчитаться в комментарий внимательно) - тогда другой вопрос, тогда нужен кастомный Date Picker плюс парсинг строки в Date/Datetime на стороне контроллера.